1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
3 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
6 <title>C++ Standard Library Active Issues List</title>
7 <style type="text/css">
9 li {text-align:justify}
10 ins {background-color:#A0FFA0}
11 del {background-color:#FFA0A0}
16 <td align="left">Doc. no.</td>
17 <td align="left">N2727=08-0237</td>
20 <td align="left">Date:</td>
21 <td align="left">2008-08-24</td>
24 <td align="left">Project:</td>
25 <td align="left">Programming Language C++</td>
28 <td align="left">Reply to:</td>
29 <td align="left">Howard Hinnant <<a href="mailto:howard.hinnant@gmail.com">howard.hinnant@gmail.com</a>></td>
32 <h1>C++ Standard Library Active Issues List (Revision R59)</h1>
34 <p>Reference ISO/IEC IS 14882:1998(E)</p>
37 <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-toc.html">Table of Contents</a> for all library issues.</li>
38 <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html">Index by Section</a> for all library issues.</li>
39 <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html">Index by Status</a> for all library issues.</li>
40 <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html">Library Defect Reports List</a></li>
41 <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html">Library Closed Issues List</a></li>
43 <p>The purpose of this document is to record the status of issues
44 which have come before the Library Working Group (LWG) of the ANSI
45 (J16) and ISO (WG21) C++ Standards Committee. Issues represent
46 potential defects in the ISO/IEC IS 14882:1998(E) document. Issues
47 are not to be used to request new features. </p>
49 <p>This document contains only library issues which are actively being
50 considered by the Library Working Group. That is, issues which have a
51 status of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>,
52 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>, and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>. See
53 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html">Library Defect Reports List</a> for issues considered defects and
54 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html">Library Closed Issues List</a> for issues considered closed.</p>
56 <p>The issues in these lists are not necessarily formal ISO Defect
57 Reports (DR's). While some issues will eventually be elevated to
58 official Defect Report status, other issues will be disposed of in
59 other ways. See <a href="#Status">Issue Status</a>.</p>
61 <p>This document is in an experimental format designed for both
62 viewing via a world-wide web browser and hard-copy printing. It
63 is available as an HTML file for browsing or PDF file for
66 <p>Prior to Revision 14, library issues lists existed in two slightly
67 different versions; a Committee Version and a Public
68 Version. Beginning with Revision 14 the two versions were combined
69 into a single version.</p>
71 <p>This document includes <i>[bracketed italicized notes]</i> as a
72 reminder to the LWG of current progress on issues. Such notes are
73 strictly unofficial and should be read with caution as they may be
74 incomplete or incorrect. Be aware that LWG support for a particular
75 resolution can quickly change if new viewpoints or killer examples are
76 presented in subsequent discussions.</p>
78 <p>For the most current official version of this document see
79 <a href="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/jtc1/sc22/wg21/</a>.
80 Requests for further information about this document should include
81 the document number above, reference ISO/IEC 14882:1998(E), and be
82 submitted to Information Technology Industry Council (ITI), 1250 Eye
83 Street NW, Washington, DC 20005.</p>
85 <p>Public information as to how to obtain a copy of the C++ Standard,
86 join the standards committee, submit an issue, or comment on an issue
87 can be found in the comp.std.c++ FAQ.
88 Public discussion of C++ Standard related issues occurs on <a href="news:comp.std.c++">news:comp.std.c++</a>.
91 <p>For committee members, files available on the committee's private
92 web site include the HTML version of the Standard itself. HTML
93 hyperlinks from this issues list to those files will only work for
94 committee members who have downloaded them into the same disk
95 directory as the issues list files. </p>
97 <h2>Revision History</h2>
100 2008-08-22 pre-San Francisco mailing.
102 <li><b>Summary:</b><ul>
103 <li>192 open issues, up by 9.</li>
104 <li>686 closed issues, up by 0.</li>
105 <li>878 issues total, up by 9.</li>
107 <li><b>Details:</b><ul>
108 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#870">870</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#871">871</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#872">872</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#873">873</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#874">874</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#875">875</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#876">876</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#877">877</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#878">878</a>.</li>
113 2008-07-28 mid-term mailing.
115 <li><b>Summary:</b><ul>
116 <li>183 open issues, up by 12.</li>
117 <li>686 closed issues, down by 4.</li>
118 <li>869 issues total, up by 8.</li>
120 <li><b>Details:</b><ul>
121 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#862">862</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#863">863</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#864">864</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#865">865</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#866">866</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#867">867</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#868">868</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#869">869</a>.</li>
122 <li>Changed the following issues from Pending NAD Editorial to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#393">393</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#557">557</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#592">592</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#754">754</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#757">757</a>.</li>
123 <li>Changed the following issues from Pending WP to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#644">644</a>.</li>
124 <li>Changed the following issues from WP to Ready: <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-active.html#629">629</a>.</li>
125 <li>Changed the following issues from Pending NAD Editorial to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#709">709</a>.</li>
130 2008-06-27 post-Sophia Antipolis mailing.
132 <li><b>Summary:</b><ul>
133 <li>171 open issues, down by 20.</li>
134 <li>690 closed issues, up by 43.</li>
135 <li>861 issues total, up by 23.</li>
137 <li><b>Details:</b><ul>
138 <li>Added the following NAD issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#840">840</a>.</li>
139 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#841">841</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#843">843</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#845">845</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#846">846</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#847">847</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#849">849</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#853">853</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#854">854</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#855">855</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#856">856</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#857">857</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#858">858</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#860">860</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#861">861</a>.</li>
140 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#839">839</a>.</li>
141 <li>Added the following Ready issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#842">842</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#844">844</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#848">848</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#850">850</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#852">852</a>.</li>
142 <li>Added the following Review issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#851">851</a>.</li>
143 <li>Changed the following issues from New to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#826">826</a>.</li>
144 <li>Changed the following issues from Open to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#570">570</a>.</li>
145 <li>Changed the following issues from New to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#786">786</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#831">831</a>.</li>
146 <li>Changed the following issues from Open to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#756">756</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#767">767</a>.</li>
147 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#723">723</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#726">726</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#794">794</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#815">815</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#825">825</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#830">830</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#833">833</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#834">834</a>.</li>
148 <li>Changed the following issues from Ready to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#471">471</a>.</li>
149 <li>Changed the following issues from Review to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#539">539</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#711">711</a>.</li>
150 <li>Changed the following issues from New to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#713">713</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#714">714</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#769">769</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#772">772</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#779">779</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#787">787</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#805">805</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#806">806</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#807">807</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#808">808</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#809">809</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#813">813</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#824">824</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#829">829</a>.</li>
151 <li>Changed the following issues from Open to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#180">180</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#396">396</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#522">522</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#720">720</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#762">762</a>.</li>
152 <li>Changed the following issues from Review to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#691">691</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#728">728</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#771">771</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#776">776</a>.</li>
153 <li>Changed the following issues from New to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#692">692</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#698">698</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#752">752</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#804">804</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#823">823</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#828">828</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#832">832</a>.</li>
154 <li>Changed the following issues from Open to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#23">23</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#675">675</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#734">734</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#803">803</a>.</li>
155 <li>Changed the following issues from Ready to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#758">758</a>.</li>
156 <li>Changed the following issues from Ready to WP: <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#518">518</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#550">550</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#574">574</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#595">595</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#596">596</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#612">612</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#618">618</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#629">629</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#638">638</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#672">672</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#685">685</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#710">710</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#715">715</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#722">722</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#740">740</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#743">743</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#744">744</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#746">746</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#749">749</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#755">755</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#759">759</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#761">761</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#766">766</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#768">768</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#770">770</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#775">775</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#777">777</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#778">778</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#781">781</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#782">782</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#783">783</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#789">789</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#792">792</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#798">798</a>.</li>
161 2008-05-16 pre-Sophia Antipolis mailing.
163 <li><b>Summary:</b><ul>
164 <li>191 open issues, up by 24.</li>
165 <li>647 closed issues, up by 1.</li>
166 <li>838 issues total, up by 25.</li>
168 <li><b>Details:</b><ul>
169 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#814">814</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#815">815</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#816">816</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#817">817</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#818">818</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#819">819</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#820">820</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#821">821</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#822">822</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#823">823</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#824">824</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#825">825</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#826">826</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#827">827</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#828">828</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#829">829</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#830">830</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#831">831</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#832">832</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#833">833</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#834">834</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#835">835</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#836">836</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#837">837</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#838">838</a>.</li>
170 <li>Changed the following issues from New to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#802">802</a>.</li>
175 2008-03-14 post-Bellevue mailing.
177 <li><b>Summary:</b><ul>
178 <li>167 open issues, down by 39.</li>
179 <li>646 closed issues, up by 65.</li>
180 <li>813 issues total, up by 26.</li>
182 <li><b>Details:</b><ul>
183 <li>Added the following Dup issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#795">795</a>.</li>
184 <li>Added the following NAD issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#790">790</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#791">791</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#796">796</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#797">797</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#799">799</a>.</li>
185 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#788">788</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#794">794</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#802">802</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#804">804</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#805">805</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#806">806</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#807">807</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#808">808</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#809">809</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#810">810</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#811">811</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#812">812</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#813">813</a>.</li>
186 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#793">793</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#800">800</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#801">801</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#803">803</a>.</li>
187 <li>Added the following Ready issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#789">789</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#792">792</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#798">798</a>.</li>
188 <li>Changed the following issues from NAD Future to Dup: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#116">116</a>.</li>
189 <li>Changed the following issues from NAD Future to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#188">188</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#323">323</a>.</li>
190 <li>Changed the following issues from New to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#729">729</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#730">730</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#731">731</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#733">733</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#735">735</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#736">736</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#737">737</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#739">739</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#741">741</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#745">745</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#748">748</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#763">763</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#764">764</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#773">773</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#784">784</a>.</li>
191 <li>Changed the following issues from Open to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#388">388</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#462">462</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#579">579</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#627">627</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#653">653</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#686">686</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#707">707</a>.</li>
192 <li>Changed the following issues from NAD Future to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#140">140</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#390">390</a>.</li>
193 <li>Changed the following issues from Open to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#529">529</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#626">626</a>.</li>
194 <li>Changed the following issues from Review to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#645">645</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#684">684</a>.</li>
195 <li>Changed the following issues from NAD Future to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#128">128</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#180">180</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#190">190</a>.</li>
196 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#617">617</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#718">718</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#719">719</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#720">720</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#724">724</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#732">732</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#734">734</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#742">742</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#747">747</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#750">750</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#753">753</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#756">756</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#760">760</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#762">762</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#767">767</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#774">774</a>.</li>
197 <li>Changed the following issues from Ready to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#675">675</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#676">676</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#688">688</a>.</li>
198 <li>Changed the following issues from New to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#709">709</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#717">717</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#725">725</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#738">738</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#754">754</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#757">757</a>.</li>
199 <li>Changed the following issues from Open to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#424">424</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#557">557</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#625">625</a>.</li>
200 <li>Changed the following issues from New to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#710">710</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#715">715</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#722">722</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#740">740</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#743">743</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#744">744</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#746">746</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#749">749</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#755">755</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#758">758</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#759">759</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#761">761</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#766">766</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#768">768</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#770">770</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#775">775</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#777">777</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#778">778</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#781">781</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#782">782</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#783">783</a>.</li>
201 <li>Changed the following issues from Open to Ready: <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-active.html#471">471</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#550">550</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#612">612</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#629">629</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a>.</li>
202 <li>Changed the following issues from Review to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#518">518</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#574">574</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#596">596</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#618">618</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#638">638</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#672">672</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#685">685</a>.</li>
203 <li>Changed the following issues from New to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#711">711</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#728">728</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#771">771</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#776">776</a>.</li>
204 <li>Changed the following issues from Open to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#539">539</a>.</li>
205 <li>Changed the following issues from Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#561">561</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#562">562</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#563">563</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#567">567</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#581">581</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#620">620</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#621">621</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#622">622</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#623">623</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#624">624</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#661">661</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#664">664</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#665">665</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#666">666</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#674">674</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#679">679</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#680">680</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#687">687</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#689">689</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#693">693</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#694">694</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#695">695</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#700">700</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#703">703</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#705">705</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#706">706</a>.</li>
206 <li>Changed the following issues from Tentatively Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#527">527</a>.</li>
211 2008-02-01 pre-Bellevue mailing.
213 <li><b>Summary:</b><ul>
214 <li>206 open issues, up by 23.</li>
215 <li>581 closed issues, up by 0.</li>
216 <li>787 issues total, up by 23.</li>
218 <li><b>Details:</b><ul>
219 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#765">765</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#766">766</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#767">767</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#768">768</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#769">769</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#770">770</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#771">771</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#772">772</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#773">773</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#774">774</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#775">775</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#776">776</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#777">777</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#778">778</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#779">779</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#780">780</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#781">781</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#782">782</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#783">783</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#784">784</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#785">785</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#786">786</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#787">787</a>.</li>
220 <li>Changed the following issues from NAD Future to Dup: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#105">105</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#348">348</a>.</li>
221 <li>Changed the following issues from NAD Future to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#353">353</a>.</li>
222 <li>Changed the following issues from New to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#697">697</a>.</li>
223 <li>Changed the following issues from NAD Future to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#388">388</a>.</li>
224 <li>Changed the following issues from Open to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#527">527</a>.</li>
229 2007-12-09 mid-term mailing.
231 <li><b>Summary:</b><ul>
232 <li>183 open issues, up by 11.</li>
233 <li>581 closed issues, down by 1.</li>
234 <li>764 issues total, up by 10.</li>
236 <li><b>Details:</b><ul>
237 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#755">755</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#756">756</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#757">757</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#758">758</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#759">759</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#760">760</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#761">761</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#762">762</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#763">763</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#764">764</a>.</li>
238 <li>Changed the following issues from NAD to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#463">463</a>.</li>
239 <li>Changed the following issues from Pending WP to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#607">607</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#608">608</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#654">654</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#655">655</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#677">677</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#682">682</a>.</li>
244 2007-10-19 post-Kona mailing.
246 <li><b>Summary:</b><ul>
247 <li>172 open issues, up by 4.</li>
248 <li>582 closed issues, up by 27.</li>
249 <li>754 issues total, up by 31.</li>
251 <li><b>Details:</b><ul>
252 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#724">724</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#725">725</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#726">726</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#727">727</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#728">728</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#729">729</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#730">730</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#731">731</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#732">732</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#733">733</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#734">734</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#735">735</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#736">736</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#737">737</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#738">738</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#739">739</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#740">740</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#741">741</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#742">742</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#743">743</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#744">744</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#745">745</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#746">746</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#747">747</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#748">748</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#749">749</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#750">750</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#751">751</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#752">752</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#753">753</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#754">754</a>.</li>
253 <li>Changed the following issues from NAD Future to Dup: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#77">77</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#350">350</a>.</li>
254 <li>Changed the following issues from New to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#639">639</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#657">657</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#663">663</a>.</li>
255 <li>Changed the following issues from Open to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#548">548</a>.</li>
256 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#546">546</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#550">550</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#564">564</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#565">565</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#573">573</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#585">585</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#588">588</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#627">627</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#629">629</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#630">630</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#632">632</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#635">635</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#653">653</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#659">659</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#667">667</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#668">668</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#669">669</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#670">670</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#671">671</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#686">686</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#704">704</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#707">707</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#708">708</a>.</li>
257 <li>Changed the following issues from New to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#393">393</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#592">592</a>.</li>
258 <li>Changed the following issues from New to Pending WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#607">607</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#608">608</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#654">654</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#655">655</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#677">677</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#682">682</a>.</li>
259 <li>Changed the following issues from New to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#561">561</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#562">562</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#563">563</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#567">567</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#581">581</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#595">595</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#620">620</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#621">621</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#622">622</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#623">623</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#624">624</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#661">661</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#664">664</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#665">665</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#666">666</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#674">674</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#675">675</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#676">676</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#679">679</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#687">687</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#688">688</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#689">689</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#693">693</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#694">694</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#695">695</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#700">700</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#703">703</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#705">705</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#706">706</a>.</li>
260 <li>Changed the following issues from Open to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#680">680</a>.</li>
261 <li>Changed the following issues from New to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#574">574</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#596">596</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#618">618</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#638">638</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#645">645</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#672">672</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#684">684</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#685">685</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#691">691</a>.</li>
262 <li>Changed the following issues from New to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#552">552</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#634">634</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#650">650</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#651">651</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#652">652</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#678">678</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#681">681</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#699">699</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#712">712</a>.</li>
263 <li>Changed the following issues from Open to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#258">258</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#401">401</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#524">524</a>.</li>
264 <li>Changed the following issues from Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#488">488</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#577">577</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#660">660</a>.</li>
269 2007-09-09 pre-Kona mailing.
271 <li><b>Summary:</b><ul>
272 <li>168 open issues, up by 15.</li>
273 <li>555 closed issues, up by 0.</li>
274 <li>723 issues total, up by 15.</li>
276 <li><b>Details:</b><ul>
277 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#709">709</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#710">710</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#711">711</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#712">712</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#713">713</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#714">714</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#715">715</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#716">716</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#717">717</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#718">718</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#719">719</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#720">720</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#721">721</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#722">722</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#723">723</a>.</li>
282 2007-08-05 post-Toronto mailing.
284 <li><b>Summary:</b><ul>
285 <li>153 open issues, down by 5.</li>
286 <li>555 closed issues, up by 17.</li>
287 <li>708 issues total, up by 12.</li>
289 <li><b>Details:</b><ul>
290 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#697">697</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#698">698</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#699">699</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#700">700</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#701">701</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#702">702</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#703">703</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#704">704</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#705">705</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#706">706</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#707">707</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#708">708</a>.</li>
291 <li>Changed the following issues from New to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#583">583</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#584">584</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#662">662</a>.</li>
292 <li>Changed the following issues from Open to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528">528</a>.</li>
293 <li>Changed the following issues from New to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#637">637</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#647">647</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#658">658</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#690">690</a>.</li>
294 <li>Changed the following issues from Open to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#525">525</a>.</li>
295 <li>Changed the following issues from Pending NAD Editorial to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#553">553</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#571">571</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#591">591</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#633">633</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#636">636</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#641">641</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#642">642</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#648">648</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#649">649</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#656">656</a>.</li>
296 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#579">579</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#631">631</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#680">680</a>.</li>
297 <li>Changed the following issues from Pending WP to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#258">258</a>.</li>
298 <li>Changed the following issues from Ready to Pending WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#644">644</a>.</li>
299 <li>Changed the following issues from New to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#577">577</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#660">660</a>.</li>
300 <li>Changed the following issues from Open to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#488">488</a>.</li>
301 <li>Changed the following issues from Open to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#518">518</a>.</li>
302 <li>Changed the following issues from Ready to TRDec: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#604">604</a>.</li>
303 <li>Changed the following issues from DR to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#453">453</a>.</li>
304 <li>Changed the following issues from Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#531">531</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#551">551</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#566">566</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#628">628</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#640">640</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#643">643</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#646">646</a>.</li>
309 2007-06-23 pre-Toronto mailing.
311 <li><b>Summary:</b><ul>
312 <li>158 open issues, up by 13.</li>
313 <li>538 closed issues, up by 7.</li>
314 <li>696 issues total, up by 20.</li>
316 <li><b>Details:</b><ul>
317 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#677">677</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#678">678</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#679">679</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#680">680</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#681">681</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#682">682</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#684">684</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#685">685</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#686">686</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#687">687</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#688">688</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#689">689</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#690">690</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#691">691</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#692">692</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#693">693</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#694">694</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#695">695</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#696">696</a>.</li>
318 <li>Added the following Pending NAD Editorial issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#683">683</a>.</li>
319 <li>Changed the following issues from New to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#587">587</a>.</li>
320 <li>Changed the following issues from Open to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#590">590</a>.</li>
321 <li>Changed the following issues from New to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#636">636</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#642">642</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#648">648</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#649">649</a>.</li>
326 2007-05-06 post-Oxford mailing.
328 <li><b>Summary:</b><ul>
329 <li>145 open issues, down by 33.</li>
330 <li>531 closed issues, up by 53.</li>
331 <li>676 issues total, up by 20.</li>
333 <li><b>Details:</b><ul>
334 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#657">657</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#658">658</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#659">659</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#660">660</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#661">661</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#662">662</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#663">663</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#664">664</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#665">665</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#666">666</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#667">667</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#668">668</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#669">669</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#670">670</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#671">671</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#672">672</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#674">674</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#675">675</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#676">676</a>.</li>
335 <li>Changed the following issues from Tentatively Ready to Dup: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#479">479</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#536">536</a>.</li>
336 <li>Changed the following issues from Tentatively Ready to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#385">385</a>, <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-closed.html#466">466</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#470">470</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#515">515</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526">526</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#547">547</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#560">560</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#572">572</a>.</li>
337 <li>Changed the following issues from NAD to NAD Editorial: <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#357">357</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#368">368</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#499">499</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#504">504</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#512">512</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#513">513</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#514">514</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#516">516</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#544">544</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#549">549</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#555">555</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#558">558</a>.</li>
338 <li>Changed the following issues from Tentatively Ready to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#482">482</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#615">615</a>.</li>
339 <li>Changed the following issues from NAD_Future to NAD Future: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#77">77</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#105">105</a>, <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#116">116</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#128">128</a>, <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-closed.html#140">140</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#149">149</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#180">180</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#188">188</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#190">190</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#219">219</a>, <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-closed.html#348">348</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#350">350</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#353">353</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#388">388</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#390">390</a>.</li>
340 <li>Changed the following issues from Tentatively Ready to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#471">471</a>.</li>
341 <li>Changed the following issues from New to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#633">633</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#641">641</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#656">656</a>.</li>
342 <li>Changed the following issues from Tentatively Ready to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#532">532</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#553">553</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#571">571</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#591">591</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#594">594</a>.</li>
343 <li>Changed the following issues from Tentatively Ready to Pending WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#258">258</a>.</li>
344 <li>Changed the following issues from New to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#566">566</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#628">628</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#640">640</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#643">643</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#644">644</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#646">646</a>.</li>
345 <li>Changed the following issues from Review to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#531">531</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#551">551</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#604">604</a>.</li>
346 <li>Changed the following issues from Ready to TRDec: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#598">598</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#599">599</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#600">600</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#601">601</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#602">602</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#603">603</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#605">605</a>.</li>
347 <li>Changed the following issues from Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#543">543</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#545">545</a>.</li>
348 <li>Changed the following issues from Tentatively Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#201">201</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#206">206</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#233">233</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#254">254</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#416">416</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#422">422</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456">456</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#534">534</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#542">542</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#559">559</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#575">575</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#576">576</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#578">578</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#586">586</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#589">589</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#593">593</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#609">609</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#610">610</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#611">611</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#613">613</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#616">616</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#619">619</a>.</li>
353 2007-03-09 pre-Oxford mailing.
355 <li><b>Summary:</b><ul>
356 <li>178 open issues, up by 37.</li>
357 <li>478 closed issues, up by 0.</li>
358 <li>656 issues total, up by 37.</li>
360 <li><b>Details:</b><ul>
361 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#620">620</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#621">621</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#622">622</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#623">623</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#624">624</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#627">627</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#628">628</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#629">629</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#630">630</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#631">631</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#632">632</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#633">633</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#634">634</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#635">635</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#636">636</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#637">637</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#638">638</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#639">639</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#640">640</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#641">641</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#642">642</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#643">643</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#644">644</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#645">645</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#646">646</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#647">647</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#648">648</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#649">649</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#650">650</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#651">651</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#652">652</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#653">653</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#654">654</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#655">655</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#656">656</a>.</li>
362 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#625">625</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#626">626</a>.</li>
363 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#570">570</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#580">580</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#582">582</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#590">590</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#612">612</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#614">614</a>.</li>
364 <li>Changed the following issues from New to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#547">547</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#553">553</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#560">560</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#571">571</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#572">572</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#575">575</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#576">576</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#578">578</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#586">586</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#589">589</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#591">591</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#593">593</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#594">594</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#609">609</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#610">610</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#611">611</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#613">613</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#615">615</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#616">616</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#619">619</a>.</li>
365 <li>Changed the following issues from Open to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#201">201</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#206">206</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#233">233</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#254">254</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#258">258</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#385">385</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#416">416</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#422">422</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456">456</a>, <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-closed.html#466">466</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#470">470</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#471">471</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#479">479</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#482">482</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#515">515</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526">526</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#532">532</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#536">536</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#542">542</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#559">559</a>.</li>
366 <li>Changed the following issues from Review to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#534">534</a>.</li>
371 2007-01-12 mid-term mailing.
373 <li><b>Summary:</b><ul>
374 <li>141 open issues, up by 11.</li>
375 <li>478 closed issues, down by 1.</li>
376 <li>619 issues total, up by 10.</li>
378 <li><b>Details:</b><ul>
379 <li>Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#610">610</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#619">619</a>.</li>
384 2006-11-03 post-Portland mailing.
386 <li><b>Summary:</b><ul>
387 <li>130 open issues, up by 0.</li>
388 <li>479 closed issues, up by 17.</li>
389 <li>609 issues total, up by 17.</li>
391 <li><b>Details:</b><ul>
392 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#520">520</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#521">521</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530">530</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#535">535</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#537">537</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#538">538</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#540">540</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#541">541</a> to WP.</li>
393 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#504">504</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#512">512</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#516">516</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#544">544</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#549">549</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#554">554</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#555">555</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#558">558</a> to NAD.</li>
394 <li>Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#569">569</a> to Dup.</li>
395 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#518">518</a>, <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-defects.html#524">524</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#542">542</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#556">556</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#557">557</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#559">559</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#597">597</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#606">606</a> to Open.</li>
396 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#543">543</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#545">545</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#549">549</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#549">549</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#598">598</a> - <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#603">603</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#605">605</a> to Ready.</li>
397 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#531">531</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#551">551</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#604">604</a> to Review.</li>
398 <li>Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#593">593</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#609">609</a>.</li>
403 2006-09-08 pre-Portland mailing.
405 <li><b>Summary:</b><ul>
406 <li>130 open issues, up by 6.</li>
407 <li>462 closed issues, down by 1.</li>
408 <li>592 issues total, up by 5.</li>
410 <li><b>Details:</b><ul>
411 <li>Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#583">583</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#592">592</a>.</li>
416 2006-06-23 mid-term mailing.
418 <li><b>Summary:</b><ul>
419 <li>124 open issues, up by 14.</li>
420 <li>463 closed issues, down by 1.</li>
421 <li>587 issues total, up by 13.</li>
423 <li><b>Details:</b><ul>
424 <li>Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#575">575</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#582">582</a>.</li>
425 <li>Reopened <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#255">255</a>.</li>
426 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#520">520</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#541">541</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#544">544</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#569">569</a> to Tentatively Ready.</li>
431 2006-04-21 post-Berlin mailing.
433 <li><b>Summary:</b><ul>
434 <li>110 open issues, down by 16.</li>
435 <li>464 closed issues, up by 24.</li>
436 <li>574 issues total, up by 8.</li>
438 <li><b>Details:</b><ul>
439 <li>Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#567">567</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#572">572</a>.</li>
440 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#499">499</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#501">501</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#506">506</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#509">509</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#511">511</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#513">513</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#514">514</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#517">517</a> to NAD.</li>
441 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#502">502</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#503">503</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#515">515</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#516">516</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#522">522</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#525">525</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#529">529</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#532">532</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#536">536</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#539">539</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#548">548</a> to Open.</li>
442 <li>Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#504">504</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#512">512</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#521">521</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530">530</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#531">531</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#535">535</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#537">537</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#538">538</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#540">540</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#549">549</a> to Ready.</li>
443 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#247">247</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#294">294</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#362">362</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#369">369</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#371">371</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#376">376</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#384">384</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#475">475</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#478">478</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#495">495</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#497">497</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#505">505</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#507">507</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#508">508</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#519">519</a> to WP.</li>
444 <li>Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#534">534</a> to Review.</li>
449 2006-02-24 pre-Berlin mailing.
451 <li><b>Summary:</b><ul>
452 <li>126 open issues, up by 31.</li>
453 <li>440 closed issues, up by 0.</li>
454 <li>566 issues total, up by 31.</li>
456 <li><b>Details:</b><ul>
457 <li>Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#536">536</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#566">566</a>.</li>
458 <li>Moved <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#342">342</a> from Ready to Open.</li>
459 <li>Reopened <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#309">309</a>.</li>
464 2005-12-16 mid-term mailing.
466 <li><b>Summary:</b><ul>
467 <li>95 open issues.</li>
468 <li>440 closed issues.</li>
469 <li>535 issues total.</li>
471 <li><b>Details:</b><ul>
472 <li>Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#529">529</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#535">535</a>.</li>
477 2005-10-14 post-Mont Tremblant mailing.
478 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526">526</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528">528</a>.
479 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.
480 Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#247">247</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.html#362">362</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#369">369</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#371">371</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#376">376</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#384">384</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#475">475</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#478">478</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#495">495</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#497">497</a> from Review to Ready.
481 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-closed.html#504">504</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#506">506</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#509">509</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#510">510</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#511">511</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#512">512</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#513">513</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#514">514</a> from New to Open.
482 Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#505">505</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#507">507</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#508">508</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#519">519</a> from New to Ready.
483 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#500">500</a> from New to NAD.
484 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#518">518</a> from New to Review.
487 2005-07-03 pre-Mont Tremblant mailing.
488 Merged open TR1 issues in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#504">504</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#522">522</a>.
489 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>
492 2005-06 mid-term mailing.
493 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>.
496 2005-04 post-Lillehammer mailing. All issues in "ready" status except
497 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
498 previously in "DR" status were moved to "WP".
501 2005-03 pre-Lillehammer mailing.
504 2005-01 mid-term mailing. Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#488">488</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#494">494</a>.
507 2004-11 post-Redmond mailing. Reflects actions taken in Redmond.
510 2004-09 pre-Redmond mailing: reflects new proposed resolutions and
511 new issues received after the 2004-07 mailing. Added
512 new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#479">479</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#481">481</a>.
515 2004-07 mid-term mailing: reflects new proposed resolutions and
516 new issues received after the post-Sydney mailing. Added
517 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-defects.html#478">478</a>.
520 Post-Sydney mailing: reflects decisions made at the Sydney meeting.
521 Voted all "Ready" issues from R29 into the working paper.
522 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-closed.html#462">462</a>.
525 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>.
528 Post-Kona mailing: reflects decisions made at the Kona meeting.
529 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>.
532 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>.
535 Post-Oxford mailing: reflects decisions made at the Oxford meeting.
536 All issues in Ready status were voted into DR status. All issues in
537 DR status were voted into WP status.
540 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>.
543 Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz
544 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
545 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
546 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
547 concerns with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#226">226</a> involve wording.
550 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>.
551 Moved issues in the TC to TC status.
554 Post-Curaçao mailing. Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#362">362</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#366">366</a>.
557 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>.
560 Post-Redmond mailing; reflects actions taken in Redmond. Added
561 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
562 <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
563 not discussed at the meeting.
565 All Ready issues were moved to DR status, with the exception of issues
566 <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>.
568 Noteworthy issues discussed at Redmond include
569 <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-defects.html#233">233</a>,
570 <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-defects.html#254">254</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#323">323</a>.
573 Pre-Redmond mailing. Added new issues
574 <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>.
577 Post-Copenhagen mailing; reflects actions taken in Copenhagen.
578 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
579 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>.
581 Changed status of issues
582 <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>
583 <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>
584 <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>
585 <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>
586 <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>
587 <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>
588 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#268">268</a>
591 Changed status of issues
592 <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>
593 <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>
594 <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>
595 <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>
596 <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>
597 <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>
598 <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>
599 <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>
600 <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>
604 <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>
605 <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>
606 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#314">314</a>
611 Pre-Copenhagen mailing. Converted issues list to XML. Added proposed
612 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>.
613 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>.
616 post-Toronto mailing; reflects actions taken in Toronto. Added new
617 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
618 <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>,
619 <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>,
620 <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>,
621 <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>,
622 <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>,
623 <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>,
624 <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>,
625 <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>,
626 <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>,
627 <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>,
628 <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>,
629 <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>,
630 <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
631 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
632 <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
633 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
634 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
635 the bug in enough places.
638 pre-Toronto mailing. Added issues
639 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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
640 changes so that we pass Weblint tests.
643 post-Tokyo II mailing; reflects committee actions taken in
644 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)
647 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>.
650 pre-Tokyo II mailing: Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#199">199</a> to
651 <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
652 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#29">29</a>. Add further rationale to issue
653 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#178">178</a>.
656 post-Kona mailing: Updated to reflect LWG and full committee actions
657 in Kona (99-0048/N1224). Note changed resolution of issues
658 <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>
659 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
660 "closed" documents. Changed the proposed resolution of issue
661 <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
662 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#38">38</a>.
665 pre-Kona updated. Added proposed resolutions <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#83">83</a>,
666 <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>,
667 <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-active.html#190">190</a> to
668 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#195">195</a>. (99-0033/D1209, 14 Oct 99)
671 pre-Kona mailing. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#140">140</a> to
672 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#189">189</a>. Issues list split into separate "active" and
673 "closed" documents. (99-0030/N1206, 25 Aug 99)
676 post-Dublin mailing. Updated to reflect LWG and full committee actions
677 in Dublin. (99-0016/N1193, 21 Apr 99)
680 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>,
681 <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>,
682 <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>,
683 <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)
686 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-active.html#128">128</a>,
687 and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#129">129</a>. (99-0007/N1194, 22 Feb 99)
690 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
691 <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
692 for making list public. (30 Dec 98)
695 post-Santa Cruz II updated: Issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#110">110</a>,
696 <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
697 issues corrected. (22 Oct 98)
700 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>
701 added, many issues updated to reflect LWG consensus (12 Oct 98)
704 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,
705 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#17">17</a> updated. (29 Sep 98)
708 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
709 format, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#64">64</a> title. (17 Sep 98)
713 <h2><a name="Status"></a>Issue Status</h2>
715 <p><b><a name="New">New</a></b> - The issue has not yet been
716 reviewed by the LWG. Any <b>Proposed Resolution</b> is purely a
717 suggestion from the issue submitter, and should not be construed as
720 <p><b><a name="Open">Open</a></b> - The LWG has discussed the issue
721 but is not yet ready to move the issue forward. There are several
722 possible reasons for open status:</p>
724 <li>Consensus may have not yet have been reached as to how to deal
726 <li>Informal consensus may have been reached, but the LWG awaits
727 exact <b>Proposed Resolution</b> wording for review.</li>
728 <li>The LWG wishes to consult additional technical experts before
730 <li>The issue may require further study.</li>
733 <p>A <b>Proposed Resolution</b> for an open issue is still not be
734 construed as the view of LWG. Comments on the current state of
735 discussions are often given at the end of open issues in an italic
736 font. Such comments are for information only and should not be given
737 undue importance.</p>
739 <p><b><a name="Dup">Dup</a></b> - The LWG has reached consensus that
740 the issue is a duplicate of another issue, and will not be further
741 dealt with. A <b>Rationale</b> identifies the duplicated issue's
744 <p><b><a name="NAD">NAD</a></b> - The LWG has reached consensus that
745 the issue is not a defect in the Standard.</p>
747 <p><b><a name="NAD Editorial">NAD Editorial</a></b> - The LWG has reached consensus that
748 the issue can either be handled editorially, or is handled by a paper (usually
749 linked to in the rationale).</p>
751 <p><b><a name="NAD Future">NAD Future</a></b> - In addition to the regular
752 status, the LWG believes that this issue should be revisited at the
753 next revision of the standard.</p>
755 <p><b><a name="Review">Review</a></b> - Exact wording of a
756 <b>Proposed Resolution</b> is now available for review on an issue
757 for which the LWG previously reached informal consensus.</p>
759 <p><b><a name="Tentatively Ready">Tentatively Ready</a></b> - The issue has
760 been reviewed online, but not in a meeting, and some support has been formed
761 for the proposed resolution. Tentatively Ready issues may be moved to Ready
762 and forwarded to full committee within the same meeting. Unlike Ready issues
763 they will be reviewed in subcommittee prior to forwarding to full committee.</p>
765 <p><b><a name="Ready">Ready</a></b> - The LWG has reached consensus
766 that the issue is a defect in the Standard, the <b>Proposed
767 Resolution</b> is correct, and the issue is ready to forward to the
768 full committee for further action as a Defect Report (DR).</p>
770 <p><b><a name="DR">DR</a></b> - (Defect Report) - The full J16
771 committee has voted to forward the issue to the Project Editor to be
772 processed as a Potential Defect Report. The Project Editor reviews
773 the issue, and then forwards it to the WG21 Convenor, who returns it
774 to the full committee for final disposition. This issues list
775 accords the status of DR to all these Defect Reports regardless of
776 where they are in that process.</p>
778 <p><b><a name="TC">TC</a></b> - (Technical Corrigenda) - The full
779 WG21 committee has voted to accept the Defect Report's Proposed
780 Resolution as a Technical Corrigenda. Action on this issue is thus
781 complete and no further action is possible under ISO rules.</p>
783 <p><b><a name="TRDec">TRDec</a></b> - (Decimal TR defect) - The
784 LWG has voted to accept the Defect Report's Proposed
785 Resolution into the Decimal TR. Action on this issue is thus
786 complete and no further action is expected.</p>
788 <p><b><a name="WP">WP</a></b> - (Working Paper) - The proposed
789 resolution has not been accepted as a Technical Corrigendum, but
790 the full WG21 committee has voted to apply the Defect Report's Proposed
791 Resolution to the working paper.</p>
793 <p><b>Pending</b> - This is a <i>status qualifier</i>. When prepended to
794 a status this indicates the issue has been
795 processed by the committee, and a decision has been made to move the issue to
796 the associated unqualified status. However for logistical reasons the indicated
797 outcome of the issue has not yet appeared in the latest working paper.
799 </p><p>Issues are always given the status of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a> when
800 they first appear on the issues list. They may progress to
801 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a> or <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a> while the LWG
802 is actively working on them. When the LWG has reached consensus on
803 the disposition of an issue, the status will then change to
804 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Dup">Dup</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD">NAD</a>, or
805 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a> as appropriate. Once the full J16 committee votes to
806 forward Ready issues to the Project Editor, they are given the
807 status of Defect Report ( <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>). These in turn may
808 become the basis for Technical Corrigenda (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>),
809 or are closed without action other than a Record of Response
810 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#RR">RR</a> ). The intent of this LWG process is that
811 only issues which are truly defects in the Standard move to the
812 formal ISO DR status.
816 <h2>Active Issues</h2>
818 <h3><a name="23"></a>23. Num_get overflow result</h3>
819 <p><b>Section:</b> 22.2.2.1.2 [facet.num.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
820 <b>Submitter:</b> Nathan Myers <b>Date:</b> 1998-08-06</p>
821 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#facet.num.get.virtuals">active issues</a> in [facet.num.get.virtuals].</p>
822 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#facet.num.get.virtuals">issues</a> in [facet.num.get.virtuals].</p>
823 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
824 <p><b>Discussion:</b></p>
825 <p>The current description of numeric input does not account for the
826 possibility of overflow. This is an implicit result of changing the
827 description to rely on the definition of scanf() (which fails to
828 report overflow), and conflicts with the documented behavior of
829 traditional and current implementations. </p>
831 <p>Users expect, when reading a character sequence that results in a
832 value unrepresentable in the specified type, to have an error
833 reported. The standard as written does not permit this. </p>
835 <p><b>Further comments from Dietmar:</b></p>
838 I don't feel comfortable with the proposed resolution to issue 23: It
839 kind of simplifies the issue to much. Here is what is going on:
843 Currently, the behavior of numeric overflow is rather counter intuitive
844 and hard to trace, so I will describe it briefly:
849 According to 22.2.2.1.2 [facet.num.get.virtuals]
850 paragraph 11 <tt>failbit</tt> is set if <tt>scanf()</tt> would
851 return an input error; otherwise a value is converted to the rules
855 <tt>scanf()</tt> is defined in terms of <tt>fscanf()</tt>.
858 <tt>fscanf()</tt> returns an input failure if during conversion no
859 character matching the conversion specification could be extracted
860 before reaching EOF. This is the only reason for <tt>fscanf()</tt>
861 to fail due to an input error and clearly does not apply to the case
865 Thus, the conversion is performed according to the rules of
866 <tt>fscanf()</tt> which basically says that <tt>strtod</tt>,
867 <tt>strtol()</tt>, etc. are to be used for the conversion.
870 The <tt>strtod()</tt>, <tt>strtol()</tt>, etc. functions consume as
871 many matching characters as there are and on overflow continue to
872 consume matching characters but also return a value identical to
873 the maximum (or minimum for signed types if there was a leading minus)
874 value of the corresponding type and set <tt>errno</tt> to <tt>ERANGE</tt>.
877 Thus, according to the current wording in the standard, overflows
878 can be detected! All what is to be done is to check <tt>errno</tt>
879 after reading an element and, of course, clearing <tt>errno</tt>
880 before trying a conversion. With the current wording, it can be
881 detected whether the overflow was due to a positive or negative
882 number for signed types.
886 <p><b>Further discussion from Redmond:</b></p>
888 <p>The basic problem is that we've defined our behavior,
889 including our error-reporting behavior, in terms of C90. However,
890 C90's method of reporting overflow in scanf is not technically an
891 "input error". The <tt>strto_*</tt> functions are more precise.</p>
893 <p>There was general consensus that <tt>failbit</tt> should be set
894 upon overflow. We considered three options based on this:</p>
896 <li>Set failbit upon conversion error (including overflow), and
897 don't store any value.</li>
898 <li>Set failbit upon conversion error, and also set <tt>errno</tt> to
899 indicated the precise nature of the error.</li>
900 <li>Set failbit upon conversion error. If the error was due to
901 overflow, store +-numeric_limits<T>::max() as an
902 overflow indication.</li>
905 <p>Straw poll: (1) 5; (2) 0; (3) 8.</p>
908 <p>Discussed at Lillehammer. General outline of what we want the
909 solution to look like: we want to say that overflow is an error, and
910 provide a way to distinguish overflow from other kinds of errors.
911 Choose candidate field the same way scanf does, but don't describe
912 the rest of the process in terms of format. If a finite input field
913 is too large (positive or negative) to be represented as a finite
914 value, then set failbit and assign the nearest representable value.
915 Bill will provide wording.</p>
918 Discussed at Toronto:
919 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2327.pdf">N2327</a>
920 is in alignment with the direction we wanted to go with in Lillehammer. Bill
926 <p><b>Proposed resolution:</b></p>
929 Change 22.2.2.1.2 [facet.num.get.virtuals], end of p3:
934 <b>Stage 3:</b> <del>The result of stage 2 processing can be one of</del>
935 <ins>The sequence of <tt>char</tt>s accumulated in stage 2 (the field) is
936 converted to a numeric value by the rules of one of the functions declared
937 in the header <tt><cstdlib></tt>:</ins>
941 <del>A sequence of <tt>char</tt>s has been accumulated in stage 2 that is
942 converted (according to the rules of <tt>scanf</tt>) to a value of the
943 type of <i>val</i>. This value is stored in <i>val</i> and <tt>ios_base::goodbit</tt> is
944 stored in <i>err</i>.</del>
945 <ins>For a signed integer value, the function <tt>strtoll</tt>.</ins>
948 <del>The sequence of <tt>char</tt>s accumulated in stage 2 would have caused
949 <tt>scanf</tt> to report an input failure. <tt>ios_base::failbit</tt> is
950 assigned to <i>err</i>.</del>
951 <ins>For an unsigned integer value, the function <tt>strtoull</tt>.</ins>
954 <ins>For a floating-point value, the function <tt>strtold</tt>.</ins>
958 <ins>The numeric value to be stored can be one of:</ins>
961 <li><ins>zero, if the conversion function fails to convert the entire field.
962 <tt>ios_base::failbit</tt> is assigned to err.</ins></li>
963 <li><ins>the most positive representable value, if the field represents a value
964 too large positive to be represented in <i>val</i>. <tt>ios_base::failbit</tt> is assigned
965 to <i>err</i>.</ins></li>
966 <li><ins>the most negative representable value (zero for unsigned integer), if
967 the field represents a value too large negative to be represented in <i>val</i>.
968 <tt>ios_base::failbit</tt> is assigned to <i>err</i>.</ins></li>
969 <li><ins>the converted value, otherwise.</ins></li>
973 The resultant numeric value is stored in <i>val</i>.
978 Change 22.2.2.1.2 [facet.num.get.virtuals], p6-p7:
982 <pre>iter_type do_get(iter_type <i>in</i>, iter_type <i>end</i>, ios_base& <i>str</i>,
983 ios_base::iostate& <i>err</i>, bool& <i>val</i>) const;
987 -6- <i>Effects:</i> If
988 <tt>(<i>str</i>.flags()&ios_base::boolalpha)==0</tt> then input
989 proceeds as it would for a <tt>long</tt> except that if a value is being
990 stored into <i>val</i>, the value is determined according to the
991 following: If the value to be stored is 0 then <tt>false</tt> is stored.
992 If the value is 1 then <tt>true</tt> is stored. Otherwise
993 <del><tt><i>err</i>|=ios_base::failbit</tt> is performed and no value</del> <ins><tt>true</tt></ins> is
994 stored<del>.</del> <ins>and <tt>ios_base::failbit</tt> is assigned to <i>err</i>.</ins>
997 -7- Otherwise target sequences are determined "as if" by calling the
998 members <tt>falsename()</tt> and <tt>truename()</tt> of the facet
999 obtained by <tt>use_facet<numpunct<charT>
1000 >(<i>str</i>.getloc())</tt>. Successive characters in the range
1001 <tt>[<i>in</i>,<i>end</i>)</tt> (see 23.1.1) are obtained and matched
1002 against corresponding positions in the target sequences only as
1003 necessary to identify a unique match. The input iterator <i>in</i> is
1004 compared to <i>end</i> only when necessary to obtain a character. If <del>and
1005 only if</del> a target sequence is uniquely matched, <i>val</i> is set to the
1006 corresponding value. <ins>Otherwise <tt>false</tt> is stored and <tt>ios_base::failbit</tt>
1007 is assigned to <i>err</i>.</ins>
1017 <h3><a name="96"></a>96. Vector<bool> is not a container</h3>
1018 <p><b>Section:</b> 23.2.6 [vector] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1019 <b>Submitter:</b> AFNOR <b>Date:</b> 1998-10-07</p>
1020 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#vector">issues</a> in [vector].</p>
1021 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1022 <p><b>Discussion:</b></p>
1023 <p><tt>vector<bool></tt> is not a container as its reference and
1024 pointer types are not references and pointers. </p>
1026 <p>Also it forces everyone to have a space optimization instead of a
1029 <p><b>See also:</b> 99-0008 == N1185 Vector<bool> is
1030 Nonconforming, Forces Optimization Choice.</p>
1032 <p><i>[In Santa Cruz the LWG felt that this was Not A Defect.]</i></p>
1035 <p><i>[In Dublin many present felt that failure to meet Container
1036 requirements was a defect. There was disagreement as to whether
1037 or not the optimization requirements constituted a defect.]</i></p>
1040 <p><i>[The LWG looked at the following resolutions in some detail:
1042 * Not A Defect.<br>
1043 * Add a note explaining that vector<bool> does not meet
1044 Container requirements.<br>
1045 * Remove vector<bool>.<br>
1046 * Add a new category of container requirements which
1047 vector<bool> would meet.<br>
1048 * Rename vector<bool>.<br>
1050 No alternative had strong, wide-spread, support and every alternative
1051 had at least one "over my dead body" response.<br>
1053 There was also mention of a transition scheme something like (1) add
1054 vector_bool and deprecate vector<bool> in the next standard. (2)
1055 Remove vector<bool> in the following standard.]</i></p>
1058 <p><i>[Modifying container requirements to permit returning proxies
1059 (thus allowing container requirements conforming vector<bool>)
1060 was also discussed.]</i></p>
1063 <p><i>[It was also noted that there is a partial but ugly workaround in
1064 that vector<bool> may be further specialized with a customer
1068 <p><i>[Kona: Herb Sutter presented his paper J16/99-0035==WG21/N1211,
1069 vector<bool>: More Problems, Better Solutions. Much discussion
1070 of a two step approach: a) deprecate, b) provide replacement under a
1071 new name. LWG straw vote on that: 1-favor, 11-could live with, 2-over
1072 my dead body. This resolution was mentioned in the LWG report to the
1073 full committee, where several additional committee members indicated
1074 over-my-dead-body positions.]</i></p>
1077 <p>Discussed at Lillehammer. General agreement that we should
1078 deprecate vector<bool> and introduce this functionality under
1079 a different name, e.g. bit_vector. This might make it possible to
1080 remove the vector<bool> specialization in the standard that comes
1081 after C++0x. There was also a suggestion that
1082 in C++0x we could additional say that it's implementation defined
1083 whether vector<bool> refers to the specialization or to the
1084 primary template, but there wasn't general agreement that this was a
1087 <p>We need a paper for the new bit_vector class.</p>
1092 <p><b>Proposed resolution:</b></p>
1095 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2050.pdf">N2050</a>
1097 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html">N2160</a>.
1101 Batavia: The LWG feels we need something closer to SGI's <tt>bitvector</tt> to ease migration
1102 from <tt>vector<bool></tt>. Although some of the funcitonality from
1103 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2050.pdf">N2050</a>
1104 could well be used in such a template. The concern is easing the API migration for those
1105 users who want to continue using a bit-packed container. Alan and Beman to work.
1114 <h3><a name="128"></a>128. Need open_mode() function for file stream, string streams, file buffers, and string buffers</h3>
1115 <p><b>Section:</b> 27.7 [string.streams], 27.8 [file.streams] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1116 <b>Submitter:</b> Angelika Langer <b>Date:</b> 1999-02-22</p>
1117 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#string.streams">issues</a> in [string.streams].</p>
1118 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1119 <p><b>Discussion:</b></p>
1120 <p>The following question came from Thorsten Herlemann:</p>
1123 <p>You can set a mode when constructing or opening a file-stream or
1124 filebuf, e.g. ios::in, ios::out, ios::binary, ... But how can I get
1125 that mode later on, e.g. in my own operator << or operator
1126 >> or when I want to check whether a file-stream or
1127 file-buffer object passed as parameter is opened for input or output
1128 or binary? Is there no possibility? Is this a design-error in the
1129 standard C++ library? </p>
1132 <p>It is indeed impossible to find out what a stream's or stream
1133 buffer's open mode is, and without that knowledge you don't know
1134 how certain operations behave. Just think of the append mode. </p>
1136 <p>Both streams and stream buffers should have a <tt>mode()</tt> function that returns the
1137 current open mode setting. </p>
1140 post Bellevue: Alisdair requested to re-Open.
1146 <p><b>Proposed resolution:</b></p>
1147 <p>For stream buffers, add a function to the base class as a non-virtual function
1148 qualified as const to 27.5.2 [streambuf]:</p>
1150 <p> <tt>openmode mode() const</tt>;</p>
1152 <p><b> Returns</b> the current open mode.</p>
1154 <p>With streams, I'm not sure what to suggest. In principle, the mode
1155 could already be returned by <tt>ios_base</tt>, but the mode is only
1156 initialized for file and string stream objects, unless I'm overlooking
1157 anything. For this reason it should be added to the most derived
1158 stream classes. Alternatively, it could be added to <tt>basic_ios</tt>
1159 and would be default initialized in <tt>basic_ios<>::init()</tt>.</p>
1162 <p><b>Rationale:</b></p>
1163 <p>This might be an interesting extension for some future, but it is
1164 not a defect in the current standard. The Proposed Resolution is
1165 retained for future reference.</p>
1172 <h3><a name="180"></a>180. Container member iterator arguments constness has unintended consequences</h3>
1173 <p><b>Section:</b> 21.3 [basic.string] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
1174 <b>Submitter:</b> Dave Abrahams <b>Date:</b> 1999-07-01</p>
1175 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#basic.string">active issues</a> in [basic.string].</p>
1176 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#basic.string">issues</a> in [basic.string].</p>
1177 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
1178 <p><b>Discussion:</b></p>
1179 <p>It is the constness of the container which should control whether
1180 it can be modified through a member function such as erase(), not the
1181 constness of the iterators. The iterators only serve to give
1182 positioning information.</p>
1184 <p>Here's a simple and typical example problem which is currently very
1185 difficult or impossible to solve without the change proposed
1188 <p>Wrap a standard container C in a class W which allows clients to
1189 find and read (but not modify) a subrange of (C.begin(), C.end()]. The
1190 only modification clients are allowed to make to elements in this
1191 subrange is to erase them from C through the use of a member function
1195 post Bellevue, Alisdair adds:
1201 This issue was implemented by
1202 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf">N2350</a>
1203 for everything but <tt>basic_string</tt>.
1207 Note that the specific example in this issue (<tt>basic_string</tt>) is the one place
1208 we forgot to amend in
1209 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf">N2350</a>,
1210 so we might open this issue for that
1222 This was a fix that was intended for all standard library containers,
1223 and has been done for other containers, but string was missed.
1226 The wording updated.
1229 We did not make the change in <tt>replace</tt>, because this change would affect
1230 the implementation because the string may be written into. This is an
1231 issue that should be taken up by concepts.
1234 We note that the supplied wording addresses the initializer list provided in
1235 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2679.pdf">N2679</a>.
1241 <p><b>Proposed resolution:</b></p>
1243 Update the following signature in the <tt>basic_string</tt> class template definition in
1244 21.3 [basic.string], p5:
1246 <blockquote><pre>namespace std {
1247 template<class charT, class traits = char_traits<charT>,
1248 class Allocator = allocator<charT> >
1249 class basic_string {
1253 iterator insert(<ins>const_</ins>iterator p, charT c);
1254 void insert(<ins>const_</ins>iterator p, size_type n, charT c);
1255 template<class InputIterator>
1256 void insert(<ins>const_</ins>iterator p, InputIterator first, InputIterator last);
1257 void insert(<ins>const_</ins>iterator <ins>p</ins>, initializer_list<charT>);
1261 iterator erase(<ins>const_</ins>iterator <ins>const_</ins>position);
1262 iterator erase(<ins>const_</ins>iterator first, <ins>const_</ins>iterator last);
1271 Update the following signatures in 21.3.6.4 [string::insert]:
1274 <blockquote><pre>iterator insert(<ins>const_</ins>iterator p, charT c);
1275 void insert(<ins>const_</ins>iterator p, size_type n, charT c);
1276 template<class InputIterator>
1277 void insert(<ins>const_</ins>iterator p, InputIterator first, InputIterator last);
1278 void insert(<ins>const_</ins>iterator <ins>p</ins>, initializer_list<charT>);
1282 Update the following signatures in 21.3.6.5 [string::erase]:
1285 <blockquote><pre>iterator erase(<ins>const_</ins>iterator <ins>const_</ins>position);
1286 iterator erase(<ins>const_</ins>iterator first, <ins>const_</ins>iterator last);
1291 <p><b>Rationale:</b></p>
1292 <p>The issue was discussed at length. It was generally agreed that 1)
1293 There is no major technical argument against the change (although
1294 there is a minor argument that some obscure programs may break), and
1295 2) Such a change would not break const correctness. The concerns about
1296 making the change were 1) it is user detectable (although only in
1297 boundary cases), 2) it changes a large number of signatures, and 3) it
1298 seems more of a design issue that an out-and-out defect.</p>
1300 <p>The LWG believes that this issue should be considered as part of a
1301 general review of const issues for the next revision of the
1302 standard. Also see issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#200">200</a>.</p>
1308 <h3><a name="190"></a>190. min() and max() functions should be std::binary_functions</h3>
1309 <p><b>Section:</b> 25.3.7 [alg.min.max] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1310 <b>Submitter:</b> Mark Rintoul <b>Date:</b> 1999-08-26</p>
1311 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#alg.min.max">issues</a> in [alg.min.max].</p>
1312 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1313 <p><b>Discussion:</b></p>
1314 <p>Both std::min and std::max are defined as template functions. This
1315 is very different than the definition of std::plus (and similar
1316 structs) which are defined as function objects which inherit
1317 std::binary_function.<br>
1319 This lack of inheritance leaves std::min and std::max somewhat useless in standard library algorithms which require
1320 a function object that inherits std::binary_function.</p>
1323 post Bellevue: Alisdair requested to re-Open.
1329 <p><b>Rationale:</b></p>
1330 <p>Although perhaps an unfortunate design decision, the omission is not a defect
1331 in the current standard. A future standard may wish to consider additional
1332 function objects.</p>
1338 <h3><a name="255"></a>255. Why do <tt>basic_streambuf<>::pbump()</tt> and <tt>gbump()</tt> take an int?</h3>
1339 <p><b>Section:</b> 27.5.2 [streambuf] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1340 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2000-08-12</p>
1341 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#streambuf">issues</a> in [streambuf].</p>
1342 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1343 <p><b>Discussion:</b></p>
1345 The basic_streambuf members gbump() and pbump() are specified to take an
1346 int argument. This requirement prevents the functions from effectively
1347 manipulating buffers larger than std::numeric_limits<int>::max()
1348 characters. It also makes the common use case for these functions
1349 somewhat difficult as many compilers will issue a warning when an
1350 argument of type larger than int (such as ptrdiff_t on LLP64
1351 architectures) is passed to either of the function. Since it's often the
1352 result of the subtraction of two pointers that is passed to the
1353 functions, a cast is necessary to silence such warnings. Finally, the
1354 usage of a native type in the functions signatures is inconsistent with
1355 other member functions (such as sgetn() and sputn()) that manipulate the
1356 underlying character buffer. Those functions take a streamsize argument.
1360 <p><b>Proposed resolution:</b></p>
1362 Change the signatures of these functions in the synopsis of template
1363 class basic_streambuf (27.5.2) and in their descriptions (27.5.2.3.1, p4
1364 and 27.5.2.3.2, p4) to take a streamsize argument.
1368 Although this change has the potential of changing the ABI of the
1369 library, the change will affect only platforms where int is different
1370 than the definition of streamsize. However, since both functions are
1371 typically inline (they are on all known implementations), even on such
1372 platforms the change will not affect any user code unless it explicitly
1373 relies on the existing type of the functions (e.g., by taking their
1374 address). Such a possibility is IMO quite remote.
1378 Alternate Suggestion from Howard Hinnant, c++std-lib-7780:
1382 This is something of a nit, but I'm wondering if streamoff wouldn't be a
1383 better choice than streamsize. The argument to pbump and gbump MUST be
1384 signed. But the standard has this to say about streamsize
1385 (27.4.1/2/Footnote):
1389 [Footnote: streamsize is used in most places where ISO C would use
1390 size_t. Most of the uses of streamsize could use size_t, except for
1391 the strstreambuf constructors, which require negative values. It
1392 should probably be the signed type corresponding to size_t (which is
1393 what Posix.2 calls ssize_t). --- end footnote]
1397 This seems a little weak for the argument to pbump and gbump. Should we
1398 ever really get rid of strstream, this footnote might go with it, along
1399 with the reason to make streamsize signed.
1403 <p><b>Rationale:</b></p>
1404 <p>The LWG believes this change is too big for now. We may wish to
1405 reconsider this for a future revision of the standard. One
1406 possibility is overloading pbump, rather than changing the
1409 [2006-05-04: Reopened at the request of Chris (Krzysztof ?elechowski)]
1417 <h3><a name="290"></a>290. Requirements to for_each and its function object</h3>
1418 <p><b>Section:</b> 25.1.4 [alg.foreach] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1419 <b>Submitter:</b> Angelika Langer <b>Date:</b> 2001-01-03</p>
1420 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#alg.foreach">issues</a> in [alg.foreach].</p>
1421 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1422 <p><b>Discussion:</b></p>
1423 <p>The specification of the for_each algorithm does not have a
1424 "Requires" section, which means that there are no
1425 restrictions imposed on the function object whatsoever. In essence it
1426 means that I can provide any function object with arbitrary side
1427 effects and I can still expect a predictable result. In particular I
1428 can expect that the function object is applied exactly last - first
1429 times, which is promised in the "Complexity" section.
1432 <p>I don't see how any implementation can give such a guarantee
1433 without imposing requirements on the function object.
1436 <p>Just as an example: consider a function object that removes
1437 elements from the input sequence. In that case, what does the
1438 complexity guarantee (applies f exactly last - first times) mean?
1441 <p>One can argue that this is obviously a nonsensical application and
1442 a theoretical case, which unfortunately it isn't. I have seen
1443 programmers shooting themselves in the foot this way, and they did not
1444 understand that there are restrictions even if the description of the
1445 algorithm does not say so.
1447 <p><i>[Lillehammer: This is more general than for_each. We don't want
1448 the function object in transform invalidiating iterators
1449 either. There should be a note somewhere in clause 17 (17, not 25)
1450 saying that user code operating on a range may not invalidate
1451 iterators unless otherwise specified. Bill will provide wording.]</i></p>
1455 <p><b>Proposed resolution:</b></p>
1463 <h3><a name="299"></a>299. Incorrect return types for iterator dereference</h3>
1464 <p><b>Section:</b> 24.1.4 [bidirectional.iterators], 24.1.5 [random.access.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1465 <b>Submitter:</b> John Potter <b>Date:</b> 2001-01-22</p>
1466 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#bidirectional.iterators">issues</a> in [bidirectional.iterators].</p>
1467 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1468 <p><b>Discussion:</b></p>
1470 In section 24.1.4 [bidirectional.iterators],
1471 Table 75 gives the return type of *r-- as convertible to T. This is
1472 not consistent with Table 74 which gives the return type of *r++ as
1473 T&. *r++ = t is valid while *r-- = t is invalid.
1477 In section 24.1.5 [random.access.iterators],
1478 Table 76 gives the return type of a[n] as convertible to T. This is
1479 not consistent with the semantics of *(a + n) which returns T& by
1480 Table 74. *(a + n) = t is valid while a[n] = t is invalid.
1484 Discussion from the Copenhagen meeting: the first part is
1485 uncontroversial. The second part, operator[] for Random Access
1486 Iterators, requires more thought. There are reasonable arguments on
1487 both sides. Return by value from operator[] enables some potentially
1488 useful iterators, e.g. a random access "iota iterator" (a.k.a
1489 "counting iterator" or "int iterator"). There isn't any obvious way
1490 to do this with return-by-reference, since the reference would be to a
1491 temporary. On the other hand, <tt>reverse_iterator</tt> takes an
1492 arbitrary Random Access Iterator as template argument, and its
1493 operator[] returns by reference. If we decided that the return type
1494 in Table 76 was correct, we would have to change
1495 <tt>reverse_iterator</tt>. This change would probably affect user
1500 History: the contradiction between <tt>reverse_iterator</tt> and the
1501 Random Access Iterator requirements has been present from an early
1502 stage. In both the STL proposal adopted by the committee
1503 (N0527==94-0140) and the STL technical report (HPL-95-11 (R.1), by
1504 Stepanov and Lee), the Random Access Iterator requirements say that
1505 operator[]'s return value is "convertible to T". In N0527
1506 reverse_iterator's operator[] returns by value, but in HPL-95-11
1507 (R.1), and in the STL implementation that HP released to the public,
1508 reverse_iterator's operator[] returns by reference. In 1995, the
1509 standard was amended to reflect the contents of HPL-95-11 (R.1). The
1510 original intent for operator[] is unclear.
1514 In the long term it may be desirable to add more fine-grained
1515 iterator requirements, so that access method and traversal strategy
1516 can be decoupled. (See "Improved Iterator Categories and
1517 Requirements", N1297 = 01-0011, by Jeremy Siek.) Any decisions
1518 about issue 299 should keep this possibility in mind.
1521 <p>Further discussion: I propose a compromise between John Potter's
1522 resolution, which requires <tt>T&</tt> as the return type of
1523 <tt>a[n]</tt>, and the current wording, which requires convertible to
1524 <tt>T</tt>. The compromise is to keep the convertible to <tt>T</tt>
1525 for the return type of the expression <tt>a[n]</tt>, but to also add
1526 <tt>a[n] = t</tt> as a valid expression. This compromise "saves" the
1527 common case uses of random access iterators, while at the same time
1528 allowing iterators such as counting iterator and caching file
1529 iterators to remain random access iterators (iterators where the
1530 lifetime of the object returned by <tt>operator*()</tt> is tied to the
1531 lifetime of the iterator).
1535 Note that the compromise resolution necessitates a change to
1536 <tt>reverse_iterator</tt>. It would need to use a proxy to support
1541 Note also there is one kind of mutable random access iterator that
1542 will no longer meet the new requirements. Currently, iterators that
1543 return an r-value from <tt>operator[]</tt> meet the requirements for a
1544 mutable random access iterartor, even though the expression <tt>a[n] =
1545 t</tt> will only modify a temporary that goes away. With this proposed
1546 resolution, <tt>a[n] = t</tt> will be required to have the same
1547 operational semantics as <tt>*(a + n) = t</tt>.
1552 <p><b>Proposed resolution:</b></p>
1555 In section 24.1.4 [lib.bidirectdional.iterators], change the return
1556 type in table 75 from "convertible to <tt>T</tt>" to
1561 In section 24.1.5 [lib.random.access.iterators], change the
1562 operational semantics for <tt>a[n]</tt> to " the r-value of
1563 <tt>a[n]</tt> is equivalent to the r-value of <tt>*(a +
1564 n)</tt>". Add a new row in the table for the expression <tt>a[n] = t</tt>
1565 with a return type of convertible to <tt>T</tt> and operational semantics of
1566 <tt>*(a + n) = t</tt>.
1569 <p><i>[Lillehammer: Real problem, but should be addressed as part of
1570 iterator redesign]</i></p>
1580 <h3><a name="309"></a>309. Does sentry catch exceptions?</h3>
1581 <p><b>Section:</b> 27.6 [iostream.format] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1582 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2001-03-19</p>
1583 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iostream.format">issues</a> in [iostream.format].</p>
1584 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1585 <p><b>Discussion:</b></p>
1587 The descriptions of the constructors of basic_istream<>::sentry
1588 (27.6.1.1.3 [istream::sentry]) and basic_ostream<>::sentry
1589 (27.6.2.4 [ostream::sentry]) do not explain what the functions do in
1590 case an exception is thrown while they execute. Some current
1591 implementations allow all exceptions to propagate, others catch them
1592 and set ios_base::badbit instead, still others catch some but let
1597 The text also mentions that the functions may call setstate(failbit)
1598 (without actually saying on what object, but presumably the stream
1599 argument is meant). That may have been fine for
1600 basic_istream<>::sentry prior to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#195">195</a>, since
1601 the function performs an input operation which may fail. However,
1602 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#195">195</a> amends 27.6.1.1.3 [istream::sentry], p2 to
1603 clarify that the function should actually call setstate(failbit |
1604 eofbit), so the sentence in p3 is redundant or even somewhat
1609 The same sentence that appears in 27.6.2.4 [ostream::sentry], p3
1610 doesn't seem to be very meaningful for basic_istream<>::sentry
1611 which performs no input. It is actually rather misleading since it
1612 would appear to guide library implementers to calling
1613 setstate(failbit) when os.tie()->flush(), the only called function,
1614 throws an exception (typically, it's badbit that's set in response to
1618 <p><b>Additional comments from Martin, who isn't comfortable with the
1619 current proposed resolution</b> (see c++std-lib-11530)</p>
1622 The istream::sentry ctor says nothing about how the function
1623 deals with exemptions (27.6.1.1.2, p1 says that the class is
1624 responsible for doing "exception safe"(*) prefix and suffix
1625 operations but it doesn't explain what level of exception
1626 safety the class promises to provide). The mockup example
1627 of a "typical implementation of the sentry ctor" given in
1628 27.6.1.1.2, p6, removed in ISO/IEC 14882:2003, doesn't show
1629 exception handling, either. Since the ctor is not classified
1630 as a formatted or unformatted input function, the text in
1631 27.6.1.1, p1 through p4 does not apply. All this would seem
1632 to suggest that the sentry ctor should not catch or in any
1633 way handle exceptions thrown from any functions it may call.
1634 Thus, the typical implementation of an istream extractor may
1635 look something like [1].
1639 The problem with [1] is that while it correctly sets ios::badbit
1640 if an exception is thrown from one of the functions called from
1641 the sentry ctor, if the sentry ctor reaches EOF while extracting
1642 whitespace from a stream that has eofbit or failbit set in
1643 exceptions(), it will cause an ios::failure to be thrown, which
1644 will in turn cause the extractor to set ios::badbit.
1648 The only straightforward way to prevent this behavior is to
1649 move the definition of the sentry object in the extractor
1650 above the try block (as suggested by the example in 22.2.8,
1651 p9 and also indirectly supported by 27.6.1.3, p1). See [2].
1652 But such an implementation will allow exceptions thrown from
1653 functions called from the ctor to freely propagate to the
1654 caller regardless of the setting of ios::badbit in the stream
1655 object's exceptions().
1659 So since neither [1] nor [2] behaves as expected, the only
1660 possible solution is to have the sentry ctor catch exceptions
1661 thrown from called functions, set badbit, and propagate those
1662 exceptions if badbit is also set in exceptions(). (Another
1663 solution exists that deals with both kinds of sentries, but
1664 the code is non-obvious and cumbersome -- see [3].)
1668 Please note that, as the issue points out, current libraries
1669 do not behave consistently, suggesting that implementors are
1670 not quite clear on the exception handling in istream::sentry,
1671 despite the fact that some LWG members might feel otherwise.
1672 (As documented by the parenthetical comment here:
1673 http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1480.html#309)
1677 Also please note that those LWG members who in Copenhagen
1678 felt that "a sentry's constructor should not catch exceptions,
1679 because sentries should only be used within (un)formatted input
1680 functions and that exception handling is the responsibility of
1681 those functions, not of the sentries," as noted here
1682 http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1310.html#309
1683 would in effect be either arguing for the behavior described
1684 in [1] or for extractors implemented along the lines of [3].
1688 The original proposed resolution (Revision 25 of the issues
1689 list) clarifies the role of the sentry ctor WRT exception
1690 handling by making it clear that extractors (both library
1691 or user-defined) should be implemented along the lines of
1692 [2] (as opposed to [1]) and that no exception thrown from
1693 the callees should propagate out of either function unless
1694 badbit is also set in exceptions().
1698 <p>[1] Extractor that catches exceptions thrown from sentry:</p>
1701 <pre>struct S { long i; };
1703 istream& operator>> (istream &strm, S &s)
1705 ios::iostate err = ios::goodbit;
1707 const istream::sentry guard (strm, false);
1709 use_facet<num_get<char> >(strm.getloc ())
1710 .get (istreambuf_iterator<char>(strm),
1711 istreambuf_iterator<char>(),
1718 strm.setstate (ios::badbit);
1728 strm.setstate (err);
1734 <p>[2] Extractor that propagates exceptions thrown from sentry:</p>
1737 <pre>istream& operator>> (istream &strm, S &s)
1739 istream::sentry guard (strm, false);
1741 ios::iostate err = ios::goodbit;
1743 use_facet<num_get<char> >(strm.getloc ())
1744 .get (istreambuf_iterator<char>(strm),
1745 istreambuf_iterator<char>(),
1751 strm.setstate (ios::badbit);
1761 strm.setstate (err);
1769 [3] Extractor that catches exceptions thrown from sentry
1770 but doesn't set badbit if the exception was thrown as a
1771 result of a call to strm.clear().
1775 <pre>istream& operator>> (istream &strm, S &s)
1777 const ios::iostate state = strm.rdstate ();
1778 const ios::iostate except = strm.exceptions ();
1779 ios::iostate err = std::ios::goodbit;
1782 const istream::sentry guard (strm, false);
1785 use_facet<num_get<char> >(strm.getloc ())
1786 .get (istreambuf_iterator<char>(strm),
1787 istreambuf_iterator<char>(),
1792 if (thrown && state & except)
1795 strm.setstate (ios::badbit);
1805 strm.setstate (err);
1813 [Pre-Berlin] Reopened at the request of Paolo Carlini and Steve Clamage.
1817 [Pre-Portland] A relevant newsgroup post:
1821 The current proposed resolution of issue #309
1822 (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#309) is
1823 unacceptable. I write commerical software and coding around this
1824 makes my code ugly, non-intuitive, and requires comments referring
1825 people to this very issue. Following is the full explanation of my
1829 In the course of writing software for commercial use, I constructed
1830 std::ifstream's based on user-supplied pathnames on typical POSIX
1834 It was expected that some files that opened successfully might not read
1835 successfully -- such as a pathname which actually refered to a
1836 directory. Intuitively, I expected the streambuffer underflow() code
1837 to throw an exception in this situation, and recent implementations of
1838 libstdc++'s basic_filebuf do just that (as well as many of my own
1842 I also intuitively expected that the istream code would convert these
1843 exceptions to the "badbit' set on the stream object, because I had not
1844 requested exceptions. I refer to 27.6.1.1. P4.
1847 However, this was not the case on at least two implementations -- if
1848 the first thing I did with an istream was call operator>>( T& ) for T
1849 among the basic arithmetic types and std::string. Looking further I
1850 found that the sentry's constructor was invoking the exception when it
1851 pre-scanned for whitespace, and the extractor function (operator>>())
1852 was not catching exceptions in this situation.
1855 So, I was in a situation where setting 'noskipws' would change the
1856 istream's behavior even though no characters (whitespace or not) could
1857 ever be successfully read.
1860 Also, calling .peek() on the istream before calling the extractor()
1861 changed the behavior (.peek() had the effect of setting the badbit
1865 I found this all to be so inconsistent and inconvenient for me and my
1866 code design, that I filed a bugzilla entry for libstdc++. I was then
1867 told that the bug cannot be fixed until issue #309 is resolved by the
1873 <p><b>Proposed resolution:</b></p>
1876 <p><b>Rationale:</b></p>
1877 <p>The LWG agrees there is minor variation between implementations,
1878 but believes that it doesn't matter. This is a rarely used corner
1879 case. There is no evidence that this has any commercial importance
1880 or that it causes actual portability problems for customers trying
1881 to write code that runs on multiple implementations.</p>
1888 <h3><a name="342"></a>342. seek and eofbit</h3>
1889 <p><b>Section:</b> 27.6.1.3 [istream.unformatted] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1890 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2001-10-09</p>
1891 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#istream.unformatted">issues</a> in [istream.unformatted].</p>
1892 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
1893 <p><b>Discussion:</b></p>
1894 <p>I think we have a defect.</p>
1896 <p>According to lwg issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#60">60</a> which is now a dr, the
1897 description of seekg in 27.6.1.3 [istream.unformatted] paragraph 38 now looks
1901 Behaves as an unformatted input function (as described in 27.6.1.3,
1902 paragraph 1), except that it does not count the number of characters
1903 extracted and does not affect the value returned by subsequent calls to
1904 gcount(). After constructing a sentry object, if fail() != true,
1905 executes rdbuf()->pubseekpos( pos).
1908 <p>And according to lwg issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#243">243</a> which is also now a dr,
1909 27.6.1.3, paragraph 1 looks like:</p>
1912 Each unformatted input function begins execution by constructing an
1913 object of class sentry with the default argument noskipws (second)
1914 argument true. If the sentry object returns true, when converted to a
1915 value of type bool, the function endeavors to obtain the requested
1916 input. Otherwise, if the sentry constructor exits by throwing an
1917 exception or if the sentry object returns false, when converted to a
1918 value of type bool, the function returns without attempting to obtain
1919 any input. In either case the number of extracted characters is set to
1920 0; unformatted input functions taking a character array of non-zero
1921 size as an argument shall also store a null character (using charT())
1922 in the first location of the array. If an exception is thrown during
1923 input then ios::badbit is turned on in *this'ss error state. If
1924 (exception()&badbit)!= 0 then the exception is rethrown. It also counts
1925 the number of characters extracted. If no exception has been thrown it
1926 ends by storing the count in a member object and returning the value
1927 specified. In any event the sentry object is destroyed before leaving
1928 the unformatted input function.
1931 <p>And finally 27.6.1.1.2/5 says this about sentry:</p>
1934 If, after any preparation is completed, is.good() is true, ok_ != false
1935 otherwise, ok_ == false.
1939 So although the seekg paragraph says that the operation proceeds if
1940 !fail(), the behavior of unformatted functions says the operation
1941 proceeds only if good(). The two statements are contradictory when only
1942 eofbit is set. I don't think the current text is clear which condition
1943 should be respected.
1946 <p><b>Further discussion from Redmond:</b></p>
1948 <p>PJP: It doesn't seem quite right to say that <tt>seekg</tt> is
1949 "unformatted". That makes specific claims about sentry that
1950 aren't quite appropriate for seeking, which has less fragile failure
1951 modes than actual input. If we do really mean that it's unformatted
1952 input, it should behave the same way as other unformatted input. On
1953 the other hand, "principle of least surprise" is that seeking from EOF
1957 Pre-Berlin: Paolo points out several problems with the proposed resolution in
1962 <li>It should apply to both overloads of seekg.</li>
1963 <li>tellg has similar issues, except that it should not call clear().</li>
1964 <li>The point about clear() seems to apply to seekp().</li>
1965 <li>Depending on the outcome of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#419">419</a>
1967 sets <tt>failbit</tt> when it finds <tt>eofbit</tt> already set, then
1968 you can never seek away from the end of stream.</li>
1973 <p><b>Proposed resolution:</b></p>
1975 <p>Change 27.6.1.3 [istream.unformatted] to:</p>
1977 Behaves as an unformatted input function (as described in 27.6.1.3,
1978 paragraph 1), except that it does not count the number of characters
1979 extracted, does not affect the value returned by subsequent calls to
1980 gcount(), and does not examine the value returned by the sentry
1981 object. After constructing a sentry object, if <tt>fail() !=
1982 true</tt>, executes <tt>rdbuf()->pubseekpos(pos)</tt>. In
1983 case of success, the function calls clear().
1984 In case of failure, the function calls <tt>setstate(failbit)</tt>
1985 (which may throw <tt>ios_base::failure</tt>).
1988 <p><i>[Lillehammer: Matt provided wording.]</i></p>
1993 <p><b>Rationale:</b></p>
1994 <p>In C, fseek does clear EOF. This is probably what most users would
1995 expect. We agree that having eofbit set should not deter a seek,
1996 and that a successful seek should clear eofbit. Note
1997 that <tt>fail()</tt> is true only if <tt>failbit</tt>
1998 or <tt>badbit</tt> is set, so using <tt>!fail()</tt>, rather
1999 than <tt>good()</tt>, satisfies this goal.</p>
2006 <h3><a name="343"></a>343. Unspecified library header dependencies</h3>
2007 <p><b>Section:</b> 21 [strings], 23 [containers], 27 [input.output] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2008 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2001-10-09</p>
2009 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#strings">issues</a> in [strings].</p>
2010 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
2011 <p><b>Discussion:</b></p>
2013 The synopses of the C++ library headers clearly show which names are
2014 required to be defined in each header. Since in order to implement the
2015 classes and templates defined in these headers declarations of other
2016 templates (but not necessarily their definitions) are typically
2017 necessary the standard in 17.4.4, p1 permits library implementers to
2018 include any headers needed to implement the definitions in each header.
2022 For instance, although it is not explicitly specified in the synopsis of
2023 <string>, at the point of definition of the std::basic_string template
2024 the declaration of the std::allocator template must be in scope. All
2025 current implementations simply include <memory> from within <string>,
2026 either directly or indirectly, to bring the declaration of
2027 std::allocator into scope.
2031 Additionally, however, some implementation also include <istream> and
2032 <ostream> at the top of <string> to bring the declarations of
2033 std::basic_istream and std::basic_ostream into scope (which are needed
2034 in order to implement the string inserter and extractor operators
2035 (21.3.7.9 [lib.string.io])). Other implementations only include
2036 <iosfwd>, since strictly speaking, only the declarations and not the
2037 full definitions are necessary.
2041 Obviously, it is possible to implement <string> without actually
2042 providing the full definitions of all the templates std::basic_string
2043 uses (std::allocator, std::basic_istream, and std::basic_ostream).
2044 Furthermore, not only is it possible, doing so is likely to have a
2045 positive effect on compile-time efficiency.
2049 But while it may seem perfectly reasonable to expect a program that uses
2050 the std::basic_string insertion and extraction operators to also
2051 explicitly include <istream> or <ostream>, respectively, it doesn't seem
2052 reasonable to also expect it to explicitly include <memory>. Since
2053 what's reasonable and what isn't is highly subjective one would expect
2054 the standard to specify what can and what cannot be assumed.
2055 Unfortunately, that isn't the case.
2058 <p>The examples below demonstrate the issue.</p>
2062 <p>It is not clear whether the following program is complete:</p>
2064 <pre>#include <string>
2066 extern std::basic_ostream<char> &strm;
2069 strm << std::string ("Hello, World!\n");
2073 <p>or whether one must explicitly include <memory> or
2074 <ostream> (or both) in addition to <string> in order for
2075 the program to compile.</p>
2080 <p>Similarly, it is unclear whether the following program is complete:</p>
2082 <pre>#include <istream>
2084 extern std::basic_iostream<char> &strm;
2087 strm << "Hello, World!\n";
2092 or whether one needs to explicitly include <ostream>, and
2093 perhaps even other headers containing the definitions of other
2094 required templates:</p>
2096 <pre>#include <ios>
2097 #include <istream>
2098 #include <ostream>
2099 #include <streambuf>
2101 extern std::basic_iostream<char> &strm;
2104 strm << "Hello, World!\n";
2110 <p>Likewise, it seems unclear whether the program below is complete:</p>
2111 <pre>#include <iterator>
2113 bool foo (std::istream_iterator<int> a, std::istream_iterator<int> b)
2121 <p>or whether one should be required to include <istream>.</p>
2123 <p>There are many more examples that demonstrate this lack of a
2124 requirement. I believe that in a good number of cases it would be
2125 unreasonable to require that a program explicitly include all the
2126 headers necessary for a particular template to be specialized, but I
2127 think that there are cases such as some of those above where it would
2128 be desirable to allow implementations to include only as much as
2129 necessary and not more.</p>
2137 Position taken in prior reviews is that the idea of a table of header
2138 dependencies is a good one. Our view is that a full paper is needed to
2139 do justice to this, and we've made that recommendation to the issue
2145 <p><b>Proposed resolution:</b></p>
2147 For every C++ library header, supply a minimum set of other C++ library
2148 headers that are required to be included by that header. The proposed
2149 list is below (C++ headers for C Library Facilities, table 12 in
2150 17.4.1.2, p3, are omitted):
2153 <pre>+------------+--------------------+
2154 | C++ header |required to include |
2155 +============+====================+
2156 |<algorithm> | |
2157 +------------+--------------------+
2159 +------------+--------------------+
2160 |<complex> | |
2161 +------------+--------------------+
2162 |<deque> |<memory> |
2163 +------------+--------------------+
2164 |<exception> | |
2165 +------------+--------------------+
2166 |<fstream> |<ios> |
2167 +------------+--------------------+
2168 |<functional>| |
2169 +------------+--------------------+
2170 |<iomanip> |<ios> |
2171 +------------+--------------------+
2172 |<ios> |<streambuf> |
2173 +------------+--------------------+
2175 +------------+--------------------+
2176 |<iostream> |<istream>, <ostream>|
2177 +------------+--------------------+
2178 |<istream> |<ios> |
2179 +------------+--------------------+
2180 |<iterator> | |
2181 +------------+--------------------+
2183 +------------+--------------------+
2184 |<list> |<memory> |
2185 +------------+--------------------+
2187 +------------+--------------------+
2188 |<map> |<memory> |
2189 +------------+--------------------+
2191 +------------+--------------------+
2192 |<new> |<exception> |
2193 +------------+--------------------+
2194 |<numeric> | |
2195 +------------+--------------------+
2196 |<ostream> |<ios> |
2197 +------------+--------------------+
2198 |<queue> |<deque> |
2199 +------------+--------------------+
2200 |<set> |<memory> |
2201 +------------+--------------------+
2202 |<sstream> |<ios>, <string> |
2203 +------------+--------------------+
2204 |<stack> |<deque> |
2205 +------------+--------------------+
2206 |<stdexcept> | |
2207 +------------+--------------------+
2208 |<streambuf> |<ios> |
2209 +------------+--------------------+
2210 |<string> |<memory> |
2211 +------------+--------------------+
2212 |<strstream> | |
2213 +------------+--------------------+
2214 |<typeinfo> |<exception> |
2215 +------------+--------------------+
2216 |<utility> | |
2217 +------------+--------------------+
2218 |<valarray> | |
2219 +------------+--------------------+
2220 |<vector> |<memory> |
2221 +------------+--------------------+
2225 <p><b>Rationale:</b></p>
2226 <p>The portability problem is real. A program that works correctly on
2227 one implementation might fail on another, because of different header
2228 dependencies. This problem was understood before the standard was
2229 completed, and it was a conscious design choice.</p>
2230 <p>One possible way to deal with this, as a library extension, would
2231 be an <all> header.</p>
2234 Hinnant: It's time we dealt with this issue for C++0X. Reopened.
2244 <h3><a name="382"></a>382. codecvt do_in/out result</h3>
2245 <p><b>Section:</b> 22.2.1.4 [locale.codecvt] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2246 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2002-08-30</p>
2247 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.codecvt">issues</a> in [locale.codecvt].</p>
2248 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
2249 <p><b>Discussion:</b></p>
2251 It seems that the descriptions of codecvt do_in() and do_out() leave
2252 sufficient room for interpretation so that two implementations of
2253 codecvt may not work correctly with the same filebuf. Specifically,
2254 the following seems less than adequately specified:
2259 the conditions under which the functions terminate
2262 precisely when the functions return ok
2265 precisely when the functions return partial
2268 the full set of conditions when the functions return error
2274 22.2.1.4.2 [locale.codecvt.virtuals], p2 says this about the effects of the
2275 function: ...Stops if it encounters a character it cannot
2276 convert... This assumes that there *is* a character to
2277 convert. What happens when there is a sequence that doesn't form a
2278 valid source character, such as an unassigned or invalid UNICODE
2279 character, or a sequence that cannot possibly form a character
2280 (e.g., the sequence "\xc0\xff" in UTF-8)?
2283 Table 53 says that the function returns codecvt_base::ok
2284 to indicate that the function(s) "completed the conversion."
2285 Suppose that the source sequence is "\xc0\x80" in UTF-8,
2286 with from pointing to '\xc0' and (from_end==from + 1).
2287 It is not clear whether the return value should be ok
2288 or partial (see below).
2291 Table 53 says that the function returns codecvt_base::partial
2292 if "not all source characters converted." With the from pointers
2293 set up the same way as above, it is not clear whether the return
2294 value should be partial or ok (see above).
2297 Table 53, in the row describing the meaning of error mistakenly
2298 refers to a "from_type" character, without the symbol from_type
2299 having been defined. Most likely, the word "source" character
2300 is intended, although that is not sufficient. The functions
2301 may also fail when they encounter an invalid source sequence
2302 that cannot possibly form a valid source character (e.g., as
2303 explained in bullet 1 above).
2307 Finally, the conditions described at the end of 22.2.1.4.2 [locale.codecvt.virtuals], p4 don't seem to be possible:
2310 "A return value of partial, if (from_next == from_end),
2311 indicates that either the destination sequence has not
2312 absorbed all the available destination elements, or that
2313 additional source elements are needed before another
2314 destination element can be produced."
2317 If the value is partial, it's not clear to me that (from_next
2318 ==from_end) could ever hold if there isn't enough room
2319 in the destination buffer. In order for (from_next==from_end) to
2320 hold, all characters in that range must have been successfully
2321 converted (according to 22.2.1.4.2 [locale.codecvt.virtuals], p2) and since there are no
2322 further source characters to convert, no more room in the
2323 destination buffer can be needed.
2326 It's also not clear to me that (from_next==from_end) could ever
2327 hold if additional source elements are needed to produce another
2328 destination character (not element as incorrectly stated in the
2329 text). partial is returned if "not all source characters have
2330 been converted" according to Table 53, which also implies that
2331 (from_next==from) does NOT hold.
2334 Could it be that the intended qualifying condition was actually
2335 (from_next != from_end), i.e., that the sentence was supposed
2339 "A return value of partial, if (from_next != from_end),..."
2342 which would make perfect sense, since, as far as I understand it,
2343 partial can only occur if (from_next != from_end)?
2345 <p><i>[Lillehammer: Defer for the moment, but this really needs to be
2346 fixed. Right now, the description of codecvt is too vague for it to
2347 be a useful contract between providers and clients of codecvt
2348 facets. (Note that both vendors and users can be both providers and
2349 clients of codecvt facets.) The major philosophical issue is whether
2350 the standard should only describe mappings that take a single wide
2351 character to multiple narrow characters (and vice versa), or whether
2352 it should describe fully general N-to-M conversions. When the
2353 original standard was written only the former was contemplated, but
2354 today, in light of the popularity of utf8 and utf16, that doesn't
2355 seem sufficient for C++0x. Bill supports general N-to-M conversions;
2356 we need to make sure Martin and Howard agree.]</i></p>
2360 <p><b>Proposed resolution:</b></p>
2366 <h3><a name="387"></a>387. std::complex over-encapsulated</h3>
2367 <p><b>Section:</b> 26.3 [complex.numbers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
2368 <b>Submitter:</b> Gabriel Dos Reis <b>Date:</b> 2002-11-08</p>
2369 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#complex.numbers">issues</a> in [complex.numbers].</p>
2370 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
2371 <p><b>Discussion:</b></p>
2373 The absence of explicit description of std::complex<T> layout
2374 makes it imposible to reuse existing software developed in traditional
2375 languages like Fortran or C with unambigous and commonly accepted
2376 layout assumptions. There ought to be a way for practitioners to
2377 predict with confidence the layout of std::complex<T> whenever T
2378 is a numerical datatype. The absence of ways to access individual
2379 parts of a std::complex<T> object as lvalues unduly promotes
2380 severe pessimizations. For example, the only way to change,
2381 independently, the real and imaginary parts is to write something like
2384 <pre>complex<T> z;
2386 // set the real part to r
2387 z = complex<T>(r, z.imag());
2389 // set the imaginary part to i
2390 z = complex<T>(z.real(), i);
2394 At this point, it seems appropriate to recall that a complex number
2395 is, in effect, just a pair of numbers with no particular invariant to
2396 maintain. Existing practice in numerical computations has it that a
2397 complex number datatype is usually represented by Cartesian
2398 coordinates. Therefore the over-encapsulation put in the specification
2399 of std::complex<> is not justified.
2404 <p><b>Proposed resolution:</b></p>
2405 <p>Add the following requirements to 26.3 [complex.numbers] as 26.3/4:</p>
2407 <p>If z is an lvalue expression of type cv std::complex<T> then</p>
2410 <li>the expression reinterpret_cast<cv T(&)[2]>(z)
2411 is well-formed; and</li>
2412 <li>reinterpret_cast<cv T(&)[2]>(z)[0]designates the
2413 real part of z; and</li>
2414 <li>reinterpret_cast<cv T(&)[2]>(z)[1]designates the
2415 imaginary part of z.</li>
2419 Moreover, if a is an expression of pointer type cv complex<T>*
2420 and the expression a[i] is well-defined for an integer expression
2425 <li>reinterpret_cast<cv T*>(a)[2*i] designates the real
2426 part of a[i]; and</li>
2427 <li>reinterpret_cast<cv T*>(a)[2*i+1] designates the
2428 imaginary part of a[i].</li>
2433 In 26.3.2 [complex] and 26.3.3 [complex.special] add the following member functions
2434 (changing <tt>T</tt> to concrete types as appropriate for the specializations).
2437 <blockquote><pre>void real(T);
2442 Add to 26.3.4 [complex.members]
2446 <pre>T real() const;
2449 <i>Returns:</i> the value of the real component
2451 <pre>void real(T val);
2454 Assigns val to the real component.
2456 <pre>T imag() const;
2459 <i>Returns:</i> the value of the imaginary component
2461 <pre>void imag(T val);
2464 Assigns val to the imaginary component.
2468 <p><i>[Kona: The layout guarantee is absolutely necessary for C
2469 compatibility. However, there was disagreement about the other part
2470 of this proposal: retrieving elements of the complex number as
2471 lvalues. An alternative: continue to have real() and imag() return
2472 rvalues, but add set_real() and set_imag(). Straw poll: return
2473 lvalues - 2, add setter functions - 5. Related issue: do we want
2474 reinterpret_cast as the interface for converting a complex to an
2475 array of two reals, or do we want to provide a more explicit way of
2476 doing it? Howard will try to resolve this issue for the next
2480 <p><i>[pre-Sydney: Howard summarized the options in n1589.]</i></p>
2489 Second half of proposed wording replaced and moved to Ready.
2493 Pre-Sophia Antipolis, Howard adds:
2498 Added the members to 26.3.3 [complex.special] and changed from Ready to Review.
2502 Post-Sophia Antipolis:
2507 Moved from WP back to Ready so that the "and 26.3.3 [complex.special]" in the proposed
2508 resolution can be officially applied.
2513 <p><b>Rationale:</b></p>
2514 <p>The LWG believes that C99 compatibility would be enough
2515 justification for this change even without other considerations. All
2516 existing implementations already have the layout proposed here.</p>
2523 <h3><a name="394"></a>394. behavior of formatted output on failure</h3>
2524 <p><b>Section:</b> 27.6.2.6.1 [ostream.formatted.reqmts] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2525 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2002-12-27</p>
2526 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
2527 <p><b>Discussion:</b></p>
2529 There is a contradiction in Formatted output about what bit is
2530 supposed to be set if the formatting fails. On sentence says it's
2531 badbit and another that it's failbit.
2534 27.6.2.5.1, p1 says in the Common Requirements on Formatted output
2537 <pre> ... If the generation fails, then the formatted output function
2538 does setstate(ios::failbit), which might throw an exception.
2541 27.6.2.5.2, p1 goes on to say this about Arithmetic Inserters:
2544 ... The formatting conversion occurs as if it performed the
2545 following code fragment:
2548 use_facet<num_put<charT,ostreambuf_iterator<charT,traits>
2550 (getloc()).put(*this, *this, fill(), val). failed();
2552 ... If failed is true then does setstate(badbit) ...
2555 The original intent of the text, according to Jerry Schwarz (see
2556 c++std-lib-10500), is captured in the following paragraph:
2559 In general "badbit" should mean that the stream is unusable because
2560 of some underlying failure, such as disk full or socket closure;
2561 "failbit" should mean that the requested formatting wasn't possible
2562 because of some inconsistency such as negative widths. So typically
2563 if you clear badbit and try to output something else you'll fail
2564 again, but if you clear failbit and try to output something else
2568 In the case of the arithmetic inserters, since num_put cannot
2569 report failure by any means other than exceptions (in response
2570 to which the stream must set badbit, which prevents the kind of
2571 recoverable error reporting mentioned above), the only other
2572 detectable failure is if the iterator returned from num_put
2573 returns true from failed().
2576 Since that can only happen (at least with the required iostream
2577 specializations) under such conditions as the underlying failure
2578 referred to above (e.g., disk full), setting badbit would seem
2579 to be the appropriate response (indeed, it is required in
2580 27.6.2.5.2, p1). It follows that failbit can never be directly
2581 set by the arithmetic (it can only be set by the sentry object
2582 under some unspecified conditions).
2585 The situation is different for other formatted output functions
2586 which can fail as a result of the streambuf functions failing
2587 (they may do so by means other than exceptions), and which are
2588 then required to set failbit.
2591 The contradiction, then, is that ostream::operator<<(int) will
2592 set badbit if the disk is full, while operator<<(ostream&,
2593 char) will set failbit under the same conditions. To make the behavior
2594 consistent, the Common requirements sections for the Formatted output
2595 functions should be changed as proposed below.
2597 <p><i>[Kona: There's agreement that this is a real issue. What we
2598 decided at Kona: 1. An error from the buffer (which can be detected
2599 either directly from streambuf's member functions or by examining a
2600 streambuf_iterator) should always result in badbit getting set.
2601 2. There should never be a circumstance where failbit gets set.
2602 That represents a formatting error, and there are no circumstances
2603 under which the output facets are specified as signaling a
2604 formatting error. (Even more so for string output that for numeric
2605 because there's nothing to format.) If we ever decide to make it
2606 possible for formatting errors to exist then the facets can signal
2607 the error directly, and that should go in clause 22, not clause 27.
2608 3. The phrase "if generation fails" is unclear and should be
2609 eliminated. It's not clear whether it's intended to mean a buffer
2610 error (e.g. a full disk), a formatting error, or something else.
2611 Most people thought it was supposed to refer to buffer errors; if
2612 so, we should say so. Martin will provide wording.]</i></p>
2617 <p><b>Proposed resolution:</b></p>
2620 <p><b>Rationale:</b></p>
2628 <h3><a name="396"></a>396. what are characters zero and one</h3>
2629 <p><b>Section:</b> 23.3.5.1 [bitset.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
2630 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-01-05</p>
2631 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#bitset.cons">issues</a> in [bitset.cons].</p>
2632 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
2633 <p><b>Discussion:</b></p>
2635 23.3.5.1, p6 [lib.bitset.cons] talks about a generic character
2636 having the value of 0 or 1 but there is no definition of what
2637 that means for charT other than char and wchar_t. And even for
2638 those two types, the values 0 and 1 are not actually what is
2639 intended -- the values '0' and '1' are. This, along with the
2640 converse problem in the description of to_string() in 23.3.5.2,
2641 p33, looks like a defect remotely related to DR 303.
2644 http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#303
2647 -6- An element of the constructed string has value zero if the
2648 corresponding character in str, beginning at position pos,
2649 is 0. Otherwise, the element has the value one.
2652 -33- Effects: Constructs a string object of the appropriate
2653 type and initializes it to a string of length N characters.
2654 Each character is determined by the value of its
2655 corresponding bit position in *this. Character position N
2656 ?- 1 corresponds to bit position zero. Subsequent decreasing
2657 character positions correspond to increasing bit positions.
2658 Bit value zero becomes the character 0, bit value one becomes
2662 Also note the typo in 23.3.5.1, p6: the object under construction
2663 is a bitset, not a string.
2673 We note that <tt>bitset</tt> has been moved from section 23 to section 20, by
2674 another issue (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#842">842</a>) previously resolved at this meeting.
2677 Disposition: move to ready.
2680 We request that Howard submit a separate issue regarding the three to_string overloads.
2686 <p><b>Proposed resolution:</b></p>
2687 <p>Change the constructor's function declaration immediately before
2688 23.3.5.1 [bitset.cons] p3 to:</p>
2689 <pre> template <class charT, class traits, class Allocator>
2691 bitset(const basic_string<charT, traits, Allocator>& str,
2692 typename basic_string<charT, traits, Allocator>::size_type pos = 0,
2693 typename basic_string<charT, traits, Allocator>::size_type n =
2694 basic_string<charT, traits, Allocator>::npos,
2695 charT zero = charT('0'), charT one = charT('1'))
2697 <p>Change the first two sentences of 23.3.5.1 [bitset.cons] p6 to: "An
2698 element of the constructed string has value 0 if the corresponding
2699 character in <i>str</i>, beginning at position <i>pos</i>,
2700 is <i>zero</i>. Otherwise, the element has the value 1.</p>
2702 <p>Change the text of the second sentence in 23.3.5.1, p5 to read:
2703 "The function then throws invalid_argument if any of the rlen
2704 characters in str beginning at position pos is other than <i>zero</i>
2705 or <i>one</i>. The function uses traits::eq() to compare the character
2709 <p>Change the declaration of the <tt>to_string</tt> member function
2710 immediately before 23.3.5.2 [bitset.members] p33 to:</p>
2711 <pre> template <class charT, class traits, class Allocator>
2712 basic_string<charT, traits, Allocator>
2713 to_string(charT zero = charT('0'), charT one = charT('1')) const;
2715 <p>Change the last sentence of 23.3.5.2 [bitset.members] p33 to: "Bit
2716 value 0 becomes the character <tt><i>zero</i></tt>, bit value 1 becomes the
2717 character <tt><i>one</i></tt>.</p>
2718 <p>Change 23.3.5.3 [bitset.operators] p8 to:</p>
2719 <p><b>Returns</b>:</p>
2720 <pre> os << x.template to_string<charT,traits,allocator<charT> >(
2721 use_facet<ctype<charT> >(<i>os</i>.getloc()).widen('0'),
2722 use_facet<ctype<charT> >(<i>os</i>.getloc()).widen('1'));
2726 <p><b>Rationale:</b></p>
2727 <p>There is a real problem here: we need the character values of '0'
2728 and '1', and we have no way to get them since strings don't have
2729 imbued locales. In principle the "right" solution would be to
2730 provide an extra object, either a ctype facet or a full locale,
2731 which would be used to widen '0' and '1'. However, there was some
2732 discomfort about using such a heavyweight mechanism. The proposed
2733 resolution allows those users who care about this issue to get it
2735 <p>We fix the inserter to use the new arguments. Note that we already
2736 fixed the analogous problem with the extractor in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#303">303</a>.</p>
2746 We are happy with the resolution as proposed, and we move this to Ready.
2755 The proposed wording neglects the 3 newer to_string overloads.
2762 <h3><a name="397"></a>397. ostream::sentry dtor throws exceptions</h3>
2763 <p><b>Section:</b> 27.6.2.4 [ostream::sentry] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2764 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-01-05</p>
2765 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#ostream::sentry">active issues</a> in [ostream::sentry].</p>
2766 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ostream::sentry">issues</a> in [ostream::sentry].</p>
2767 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
2768 <p><b>Discussion:</b></p>
2770 17.4.4.8, p3 prohibits library dtors from throwing exceptions.
2773 27.6.2.3, p4 says this about the ostream::sentry dtor:
2775 <pre> -4- If ((os.flags() & ios_base::unitbuf) && !uncaught_exception())
2776 is true, calls os.flush().
2779 27.6.2.6, p7 that describes ostream::flush() says:
2781 <pre> -7- If rdbuf() is not a null pointer, calls rdbuf()->pubsync().
2782 If that function returns ?-1 calls setstate(badbit) (which
2783 may throw ios_base::failure (27.4.4.3)).
2786 That seems like a defect, since both pubsync() and setstate() can
2790 The contradiction is real. Clause 17 says destructors may never
2791 throw exceptions, and clause 27 specifies a destructor that does
2792 throw. In principle we might change either one. We're leaning
2793 toward changing clause 17: putting in an "unless otherwise specified"
2794 clause, and then putting in a footnote saying the sentry destructor
2795 is the only one that can throw. PJP suggests specifying that
2796 sentry::~sentry() should internally catch any exceptions it might cause.
2801 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#418">418</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#622">622</a> for related issues.
2807 <p><b>Proposed resolution:</b></p>
2814 <h3><a name="398"></a>398. effects of end-of-file on unformatted input functions</h3>
2815 <p><b>Section:</b> 27.6.2.4 [ostream::sentry] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2816 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-01-05</p>
2817 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#ostream::sentry">active issues</a> in [ostream::sentry].</p>
2818 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ostream::sentry">issues</a> in [ostream::sentry].</p>
2819 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
2820 <p><b>Discussion:</b></p>
2822 While reviewing unformatted input member functions of istream
2823 for their behavior when they encounter end-of-file during input
2824 I found that the requirements vary, sometimes unexpectedly, and
2825 in more than one case even contradict established practice (GNU
2826 libstdc++ 3.2, IBM VAC++ 6.0, STLPort 4.5, SunPro 5.3, HP aCC
2827 5.38, Rogue Wave libstd 3.1, and Classic Iostreams).
2830 The following unformatted input member functions set eofbit if they
2831 encounter an end-of-file (this is the expected behavior, and also
2832 the behavior of all major implementations):
2834 <pre> basic_istream<charT, traits>&
2835 get (char_type*, streamsize, char_type);
2838 Also sets failbit if it fails to extract any characters.
2840 <pre> basic_istream<charT, traits>&
2841 get (char_type*, streamsize);
2844 Also sets failbit if it fails to extract any characters.
2846 <pre> basic_istream<charT, traits>&
2847 getline (char_type*, streamsize, char_type);
2850 Also sets failbit if it fails to extract any characters.
2852 <pre> basic_istream<charT, traits>&
2853 getline (char_type*, streamsize);
2856 Also sets failbit if it fails to extract any characters.
2858 <pre> basic_istream<charT, traits>&
2859 ignore (int, int_type);
2861 <pre> basic_istream<charT, traits>&
2862 read (char_type*, streamsize);
2865 Also sets failbit if it encounters end-of-file.
2867 <pre> streamsize readsome (char_type*, streamsize);
2871 The following unformated input member functions set failbit but
2872 not eofbit if they encounter an end-of-file (I find this odd
2873 since the functions make it impossible to distinguish a general
2874 failure from a failure due to end-of-file; the requirement is
2875 also in conflict with all major implementation which set both
2876 eofbit and failbit):
2878 <pre> int_type get();
2880 <pre> basic_istream<charT, traits>&
2881 get (char_type&);
2884 These functions only set failbit of they extract no characters,
2885 otherwise they don't set any bits, even on failure (I find this
2886 inconsistency quite unexpected; the requirement is also in
2887 conflict with all major implementations which set eofbit
2888 whenever they encounter end-of-file):
2890 <pre> basic_istream<charT, traits>&
2891 get (basic_streambuf<charT, traits>&, char_type);
2893 <pre> basic_istream<charT, traits>&
2894 get (basic_streambuf<charT, traits>&);
2897 This function sets no bits (all implementations except for
2898 STLport and Classic Iostreams set eofbit when they encounter
2901 <pre> int_type peek ();
2903 <p>Informally, what we want is a global statement of intent saying
2904 that eofbit gets set if we trip across EOF, and then we can take
2905 away the specific wording for individual functions. A full review
2906 is necessary. The wording currently in the standard is a mishmash,
2907 and changing it on an individual basis wouldn't make things better.
2908 Dietmar will do this work.</p>
2911 <p><b>Proposed resolution:</b></p>
2917 <h3><a name="408"></a>408. Is vector<reverse_iterator<char*> > forbidden?</h3>
2918 <p><b>Section:</b> 24.1 [iterator.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2919 <b>Submitter:</b> Nathan Myers <b>Date:</b> 2003-06-03</p>
2920 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#iterator.requirements">active issues</a> in [iterator.requirements].</p>
2921 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iterator.requirements">issues</a> in [iterator.requirements].</p>
2922 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
2923 <p><b>Discussion:</b></p>
2925 I've been discussing iterator semantics with Dave Abrahams, and a
2926 surprise has popped up. I don't think this has been discussed before.
2930 24.1 [iterator.requirements] says that the only operation that can be performed on "singular"
2931 iterator values is to assign a non-singular value to them. (It
2932 doesn't say they can be destroyed, and that's probably a defect.)
2933 Some implementations have taken this to imply that there is no need
2934 to initialize the data member of a reverse_iterator<> in the default
2935 constructor. As a result, code like
2937 <blockquote><pre> std::vector<std::reverse_iterator<char*> > v(7);
2941 invokes undefined behavior, because it must default-initialize the
2942 vector elements, and then copy them to other storage. Of course many
2943 other vector operations on these adapters are also left undefined,
2944 and which those are is not reliably deducible from the standard.
2948 I don't think that 24.1 was meant to make standard-library iterator
2949 types unsafe. Rather, it was meant to restrict what operations may
2950 be performed by functions which take general user- and standard
2951 iterators as arguments, so that raw pointers would qualify as
2952 iterators. However, this is not clear in the text, others have come
2953 to the opposite conclusion.
2957 One question is whether the standard iterator adaptors have defined
2958 copy semantics. Another is whether they have defined destructor
2961 <blockquote><pre> { std::vector<std::reverse_iterator<char*> > v(7); }
2968 Note this is not a question of whether algorithms are allowed to
2969 rely on copy semantics for arbitrary iterators, just whether the
2970 types we actually supply support those operations. I believe the
2971 resolution must be expressed in terms of the semantics of the
2972 adapter's argument type. It should make clear that, e.g., the
2973 reverse_iterator<T> constructor is actually required to execute
2974 T(), and so copying is defined if the result of T() is copyable.
2978 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#235">235</a>, which defines reverse_iterator's default
2979 constructor more precisely, has some relevance to this issue.
2980 However, it is not the whole story.
2984 The issue was whether
2986 <blockquote><pre> reverse_iterator() { }
2991 <blockquote><pre> reverse_iterator() : current() { }
2995 The difference is when T is char*, where the first leaves the member
2996 uninitialized, and possibly equal to an existing pointer value, or
2997 (on some targets) may result in a hardware trap when copied.
3001 8.5 paragraph 5 seems to make clear that the second is required to
3002 satisfy DR <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#235">235</a>, at least for non-class Iterator argument
3007 But that only takes care of reverse_iterator, and doesn't establish
3008 a policy for all iterators. (The reverse iterator adapter was just
3009 an example.) In particular, does my function
3011 <blockquote><pre> template <typename Iterator>
3012 void f() { std::vector<Iterator> v(7); }
3015 evoke undefined behavior for some conforming iterator definitions?
3016 I think it does, now, because vector<> will destroy those singular
3017 iterator values, and that's explicitly disallowed.
3021 24.1 shouldn't give blanket permission to copy all singular iterators,
3022 because then pointers wouldn't qualify as iterators. However, it
3023 should allow copying of that subset of singular iterator values that
3024 are default-initialized, and it should explicitly allow destroying any
3025 iterator value, singular or not, default-initialized or not.
3028 <p>Related issue: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#407">407</a></p>
3030 We don't want to require all singular iterators to be copyable,
3031 because that is not the case for pointers. However, default
3032 construction may be a special case. Issue: is it really default
3033 construction we want to talk about, or is it something like value
3034 initialization? We need to check with core to see whether default
3035 constructed pointers are required to be copyable; if not, it would be
3036 wrong to impose so strict a requirement for iterators.
3042 <p><b>Proposed resolution:</b></p>
3049 <h3><a name="417"></a>417. what does ctype::do_widen() return on failure</h3>
3050 <p><b>Section:</b> 22.2.1.1.2 [locale.ctype.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3051 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-09-18</p>
3052 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.ctype.virtuals">issues</a> in [locale.ctype.virtuals].</p>
3053 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3054 <p><b>Discussion:</b></p>
3056 The Effects and Returns clauses of the do_widen() member function of
3057 the ctype facet fail to specify the behavior of the function on failure.
3058 That the function may not be able to simply cast the narrow character
3059 argument to the type of the result since doing so may yield the wrong value
3060 for some wchar_t encodings. Popular implementations of ctype<wchar_t> that
3061 use mbtowc() and UTF-8 as the native encoding (e.g., GNU glibc) will fail
3062 when the argument's MSB is set. There is no way for the the rest of locale
3063 and iostream to reliably detect this failure.
3065 <p><i>[Kona: This is a real problem. Widening can fail. It's unclear
3066 what the solution should be. Returning WEOF works for the wchar_t
3067 specialization, but not in general. One option might be to add a
3068 default, like <i>narrow</i>. But that's an incompatible change.
3069 Using <i>traits::eof</i> might seem like a good idea, but facets
3070 don't have access to traits (a recurring problem). We could
3071 have <i>widen</i> throw an exception, but that's a scary option;
3072 existing library components aren't written with the assumption
3073 that <i>widen</i> can throw.]</i></p>
3077 <p><b>Proposed resolution:</b></p>
3083 <h3><a name="418"></a>418. exceptions thrown during iostream cleanup</h3>
3084 <p><b>Section:</b> 27.4.2.1.6 [ios::Init] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3085 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-09-18</p>
3086 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3087 <p><b>Discussion:</b></p>
3089 The dtor of the ios_base::Init object is supposed to call flush() on the
3090 6 standard iostream objects cout, cerr, clog, wcout, wcerr, and wclog.
3091 This call may cause an exception to be thrown.
3095 17.4.4.8, p3 prohibits all library destructors from throwing exceptions.
3099 The question is: What should this dtor do if one or more of these calls
3100 to flush() ends up throwing an exception? This can happen quite easily
3101 if one of the facets installed in the locale imbued in the iostream
3104 <p><i>[Kona: We probably can't do much better than what we've got, so
3105 the LWG is leaning toward NAD. At the point where the standard
3106 stream objects are being cleaned up, the usual error reporting
3107 mechanism are all unavailable. And exception from flush at this
3108 point will definitely cause problems. A quality implementation
3109 might reasonably swallow the exception, or call abort, or do
3110 something even more drastic.]</i></p>
3114 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#397">397</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#622">622</a> for related issues.
3120 <p><b>Proposed resolution:</b></p>
3126 <h3><a name="419"></a>419. istream extractors not setting failbit if eofbit is already set</h3>
3127 <p><b>Section:</b> 27.6.1.1.3 [istream::sentry] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3128 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-09-18</p>
3129 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#istream::sentry">issues</a> in [istream::sentry].</p>
3130 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3131 <p><b>Discussion:</b></p>
3134 27.6.1.1.3 [istream::sentry], p2 says that istream::sentry ctor prepares for input if is.good()
3135 is true. p4 then goes on to say that the ctor sets the sentry::ok_ member to
3136 true if the stream state is good after any preparation. 27.6.1.2.1 [istream.formatted.reqmts], p1 then
3137 says that a formatted input function endeavors to obtain the requested input
3138 if the sentry's operator bool() returns true.
3140 Given these requirements, no formatted extractor should ever set failbit if
3141 the initial stream rdstate() == eofbit. That is contrary to the behavior of
3142 all implementations I tested. The program below prints out
3150 #include <sstream>
3151 #include <cstdio>
3155 std::istringstream strm ("1");
3161 std::printf ("eof = %d, fail = %d\n",
3162 !!strm.eof (), !!strm.fail ());
3166 std::printf ("eof = %d, fail = %d\n",
3167 !!strm.eof (), !!strm.fail ());
3174 Comments from Jerry Schwarz (c++std-lib-11373):
3177 Jerry Schwarz wrote:
3180 I don't know where (if anywhere) it says it in the standard, but the
3181 formatted extractors are supposed to set failbit if they don't extract
3182 any characters. If they didn't then simple loops like
3185 while (cin >> x);
3191 Further comments from Martin Sebor:
3194 The question is which part of the extraction should prevent this from happening
3195 by setting failbit when eofbit is already set. It could either be the sentry
3196 object or the extractor. It seems that most implementations have chosen to
3197 set failbit in the sentry [...] so that's the text that will need to be
3202 Pre Berlin: This issue is related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#342">342</a>. If the sentry
3203 sets <tt>failbit</tt> when it finds <tt>eofbit</tt> already set, then
3204 you can never seek away from the end of stream.
3206 <p>Kona: Possibly NAD. If eofbit is set then good() will return false. We
3207 then set <i>ok</i> to false. We believe that the sentry's
3208 constructor should always set failbit when <i>ok</i> is false, and
3209 we also think the standard already says that. Possibly it could be
3214 <p><b>Proposed resolution:</b></p>
3216 Change 27.6.1.1.3 [istream::sentry], p2 to:
3220 <pre>explicit sentry(basic_istream<charT,traits>& <i>is</i> , bool <i>noskipws</i> = false);</pre>
3222 -2- <i>Effects:</i> If <tt>is.good()</tt> is <del><tt>true</tt></del>
3223 <ins><tt>false</tt></ins>, <ins>calls <tt>is.setstate(failbit)</tt>.
3224 Otherwise</ins> prepares for formatted or unformatted input. ...
3234 <h3><a name="421"></a>421. is basic_streambuf copy-constructible?</h3>
3235 <p><b>Section:</b> 27.5.2.1 [streambuf.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3236 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-09-18</p>
3237 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#streambuf.cons">issues</a> in [streambuf.cons].</p>
3238 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3239 <p><b>Discussion:</b></p>
3241 The reflector thread starting with c++std-lib-11346 notes that the class
3242 template basic_streambuf, along with basic_stringbuf and basic_filebuf,
3243 is copy-constructible but that the semantics of the copy constructors
3244 are not defined anywhere. Further, different implementations behave
3245 differently in this respect: some prevent copy construction of objects
3246 of these types by declaring their copy ctors and assignment operators
3247 private, others exhibit undefined behavior, while others still give
3248 these operations well-defined semantics.
3252 Note that this problem doesn't seem to be isolated to just the three
3253 types mentioned above. A number of other types in the library section
3254 of the standard provide a compiler-generated copy ctor and assignment
3255 operator yet fail to specify their semantics. It's believed that the
3256 only types for which this is actually a problem (i.e. types where the
3257 compiler-generated default may be inappropriate and may not have been
3258 intended) are locale facets. See issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#439">439</a>.
3262 <p><b>Proposed resolution:</b></p>
3264 27.5.2 [lib.streambuf]: Add into the synopsis, public section, just above the destructor declaration:
3268 <pre>basic_streambuf(const basic_streambuf& sb);
3269 basic_streambuf& operator=(const basic_streambuf& sb);
3273 <p>Insert after 27.5.2.1, paragraph 2:</p>
3275 <pre>basic_streambuf(const basic_streambuf& sb);
3278 <p>Constructs a copy of sb.</p>
3279 <p>Postcondtions:</p>
3280 <pre> eback() == sb.eback()
3282 egptr() == sb.egptr()
3283 pbase() == sb.pbase()
3285 epptr() == sb.epptr()
3286 getloc() == sb.getloc()
3289 <pre>basic_streambuf& operator=(const basic_streambuf& sb);
3292 <p>Assigns the data members of sb to this.</p>
3294 <p>Postcondtions:</p>
3295 <pre> eback() == sb.eback()
3297 egptr() == sb.egptr()
3298 pbase() == sb.pbase()
3300 epptr() == sb.epptr()
3301 getloc() == sb.getloc()
3304 <p>Returns: *this.</p>
3307 <p>27.7.1 [lib.stringbuf]:</p>
3309 <p><b>Option A:</b></p>
3312 <p>Insert into the basic_stringbuf synopsis in the private section:</p>
3314 <pre>basic_stringbuf(const basic_stringbuf&); // not defined
3315 basic_stringbuf& operator=(const basic_stringbuf&); // not defined
3319 <p><b>Option B:</b></p>
3322 <p>Insert into the basic_stringbuf synopsis in the public section:</p>
3324 <pre>basic_stringbuf(const basic_stringbuf& sb);
3325 basic_stringbuf& operator=(const basic_stringbuf& sb);
3328 <p>27.7.1.1, insert after paragraph 4:</p>
3330 <pre>basic_stringbuf(const basic_stringbuf& sb);</pre>
3333 Constructs an independent copy of sb as if with sb.str(), and with the openmode that sb was constructed with.
3336 <p>Postcondtions: </p>
3337 <pre> str() == sb.str()
3338 gptr() - eback() == sb.gptr() - sb.eback()
3339 egptr() - eback() == sb.egptr() - sb.eback()
3340 pptr() - pbase() == sb.pptr() - sb.pbase()
3341 getloc() == sb.getloc()
3345 Note: The only requirement on epptr() is that it point beyond the
3346 initialized range if an output sequence exists. There is no requirement
3347 that epptr() - pbase() == sb.epptr() - sb.pbase().
3350 <pre>basic_stringbuf& operator=(const basic_stringbuf& sb);</pre>
3351 <p>After assignment the basic_stringbuf has the same state as if it
3352 were initially copy constructed from sb, except that the
3353 basic_stringbuf is allowed to retain any excess capacity it might have,
3354 which may in turn effect the value of epptr().
3358 <p>27.8.1.1 [lib.filebuf]</p>
3360 <p>Insert at the bottom of the basic_filebuf synopsis:</p>
3364 basic_filebuf(const basic_filebuf&); // not defined
3365 basic_filebuf& operator=(const basic_filebuf&); // not defined
3368 <p><i>[Kona: this is an issue for basic_streambuf itself and for its
3369 derived classes. We are leaning toward allowing basic_streambuf to
3370 be copyable, and specifying its precise semantics. (Probably the
3371 obvious: copying the buffer pointers.) We are less sure whether
3372 the streambuf derived classes should be copyable. Howard will
3373 write up a proposal.]</i></p>
3376 <p><i>[Sydney: Dietmar presented a new argument against basic_streambuf
3377 being copyable: it can lead to an encapsulation violation. Filebuf
3378 inherits from streambuf. Now suppose you inhert a my_hijacking_buf
3379 from streambuf. You can copy the streambuf portion of a filebuf to a
3380 my_hijacking_buf, giving you access to the pointers into the
3381 filebuf's internal buffer. Perhaps not a very strong argument, but
3382 it was strong enough to make people nervous. There was weak
3383 preference for having streambuf not be copyable. There was weak
3384 preference for having stringbuf not be copyable even if streambuf
3385 is. Move this issue to open for now.
3391 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1862.html#27.5.2%20-%20Class%20template%20basic_streambuf%3CcharT,traits%3E">Rvalue Reference Recommendations for Chapter 27</a>
3392 recommends protected copy constructor and assignment for <tt>basic_streambuf</tt> with the same semantics
3393 as would be generated by the compiler. These members aid in derived classes implementing move semantics.
3394 A protected copy constructor and copy assignment operator do not expose encapsulation more so than it is
3395 today as each data member of a <tt>basic_streambuf</tt> is already both readable and writable by derived
3396 classes via various get/set protected member functions (<tt>eback()</tt>, <tt>setp()</tt>, etc.). Rather
3397 a protected copy constructor and copy assignment operator simply make the job of derived classes implementing
3398 move semantics less tedious and error prone.
3404 <p><b>Rationale:</b></p>
3406 27.5.2 [lib.streambuf]: The proposed basic_streambuf copy constructor
3407 and assignment operator are the same as currently implied by the lack
3408 of declarations: public and simply copies the data members. This
3409 resolution is not a change but a clarification of the current
3414 27.7.1 [lib.stringbuf]: There are two reasonable options: A) Make
3415 basic_stringbuf not copyable. This is likely the status-quo of
3416 current implementations. B) Reasonable copy semantics of
3417 basic_stringbuf can be defined and implemented. A copyable
3418 basic_streambuf is arguably more useful than a non-copyable one. This
3419 should be considered as new functionality and not the fixing of a
3420 defect. If option B is chosen, ramifications from issue 432 are taken
3425 27.8.1.1 [lib.filebuf]: There are no reasonable copy semantics for
3435 <h3><a name="423"></a>423. effects of negative streamsize in iostreams</h3>
3436 <p><b>Section:</b> 27 [input.output] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3437 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-09-18</p>
3438 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#input.output">issues</a> in [input.output].</p>
3439 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3440 <p><b>Discussion:</b></p>
3443 A third party test suite tries to exercise istream::ignore(N) with
3444 a negative value of N and expects that the implementation will treat
3445 N as if it were 0. Our implementation asserts that (N >= 0) holds and
3450 I can't find anything in section 27 that prohibits such values but I don't
3451 see what the effects of such calls should be, either (this applies to
3452 a number of unformatted input functions as well as some member functions
3453 of the basic_streambuf template).
3457 <p><b>Proposed resolution:</b></p>
3459 I propose that we add to each function in clause 27 that takes an argument,
3460 say N, of type streamsize a Requires clause saying that "N >= 0." The intent
3461 is to allow negative streamsize values in calls to precision() and width()
3462 but disallow it in calls to streambuf::sgetn(), istream::ignore(), or
3466 <p><i>[Kona: The LWG agreed that this is probably what we want. However, we
3467 need a review to find all places where functions in clause 27 take
3468 arguments of type streamsize that shouldn't be allowed to go
3469 negative. Martin will do that review.]</i></p>
3477 <h3><a name="427"></a>427. stage 2 and rationale of DR 221</h3>
3478 <p><b>Section:</b> 22.2.2.1.2 [facet.num.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3479 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-09-18</p>
3480 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#facet.num.get.virtuals">active issues</a> in [facet.num.get.virtuals].</p>
3481 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#facet.num.get.virtuals">issues</a> in [facet.num.get.virtuals].</p>
3482 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3483 <p><b>Discussion:</b></p>
3485 The requirements specified in Stage 2 and reiterated in the rationale
3486 of DR 221 (and echoed again in DR 303) specify that num_get<charT>::
3487 do_get() compares characters on the stream against the widened elements
3488 of "012...abc...ABCX+-"
3492 An implementation is required to allow programs to instantiate the num_get
3493 template on any charT that satisfies the requirements on a user-defined
3494 character type. These requirements do not include the ability of the
3495 character type to be equality comparable (the char_traits template must
3496 be used to perform tests for equality). Hence, the num_get template cannot
3497 be implemented to support any arbitrary character type. The num_get template
3498 must either make the assumption that the character type is equality-comparable
3499 (as some popular implementations do), or it may use char_traits<charT> to do
3500 the comparisons (some other popular implementations do that). This diversity
3501 of approaches makes it difficult to write portable programs that attempt to
3502 instantiate the num_get template on user-defined types.
3505 <p><i>[Kona: the heart of the problem is that we're theoretically
3506 supposed to use traits classes for all fundamental character
3507 operations like assignment and comparison, but facets don't have
3508 traits parameters. This is a fundamental design flaw and it
3509 appears all over the place, not just in this one place. It's not
3510 clear what the correct solution is, but a thorough review of facets
3511 and traits is in order. The LWG considered and rejected the
3512 possibility of changing numeric facets to use narrowing instead of
3513 widening. This may be a good idea for other reasons (see issue
3514 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#459">459</a>), but it doesn't solve the problem raised by this
3515 issue. Whether we use widen or narrow the <tt>num_get</tt> facet
3516 still has no idea which traits class the user wants to use for
3517 the comparison, because only streams, not facets, are passed traits
3518 classes. The standard does not require that two different
3519 traits classes with the same <tt>char_type</tt> must necessarily
3520 have the same behavior.]</i></p>
3523 <p>Informally, one possibility: require that some of the basic
3524 character operations, such as <tt>eq</tt>, <tt>lt</tt>,
3525 and <tt>assign</tt>, must behave the same way for all traits classes
3526 with the same <tt>char_type</tt>. If we accept that limitation on
3527 traits classes, then the facet could reasonably be required to
3528 use <tt>char_traits<charT></tt>.</p>
3531 <p><b>Proposed resolution:</b></p>
3537 <h3><a name="430"></a>430. valarray subset operations</h3>
3538 <p><b>Section:</b> 26.5.2.4 [valarray.sub] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3539 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2003-09-18</p>
3540 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3541 <p><b>Discussion:</b></p>
3543 The standard fails to specify the behavior of valarray::operator[](slice)
3544 and other valarray subset operations when they are passed an "invalid"
3545 slice object, i.e., either a slice that doesn't make sense at all (e.g.,
3546 slice (0, 1, 0) or one that doesn't specify a valid subset of the valarray
3547 object (e.g., slice (2, 1, 1) for a valarray of size 1).
3549 <p><i>[Kona: the LWG believes that invalid slices should invoke
3550 undefined behavior. Valarrays are supposed to be designed for high
3551 performance, so we don't want to require specific checking. We
3552 need wording to express this decision.]</i></p>
3561 Please note that the standard also fails to specify the behavior of
3562 slice_array and gslice_array in the valid case. Bill Plauger will
3563 endeavor to provide revised wording for slice_array and gslice_array.
3567 post-Bellevue: Bill provided wording.
3572 <p><b>Proposed resolution:</b></p>
3574 Insert after 26.5.2.4 [valarray.sub], paragraph 1:
3579 The member operator is overloaded to provide several ways to select
3581 of elements from among those controlled by <tt>*this</tt>. The first group of five
3582 member operators work in conjunction with various overloads of <tt>operator=</tt>
3583 (and other assigning operators) to allow selective replacement (slicing) of
3584 the controlled sequence. The selected elements must exist.
3587 The first member operator selects element off. For example:
3590 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3592 // v0 == valarray<char>("abcAefghijklmnop", 16)
3596 The second member operator selects those elements of the controlled sequence
3597 designated by <tt>slicearr</tt>. For example:
3600 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3601 valarray<char> v1("ABCDE", 5);
3602 v0[slice(2, 5, 3)] = v1;
3603 // v0 == valarray<char>("abAdeBghCjkDmnEp", 16)
3607 The third member operator selects those elements of the controlled sequence
3608 designated by <tt>gslicearr</tt>. For example:
3611 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3612 valarray<char> v1("ABCDEF", 6);
3613 const size_t lv[] = {2, 3};
3614 const size_t dv[] = {7, 2};
3615 const valarray<size_t> len(lv, 2), str(dv, 2);
3616 v0[gslice(3, len, str)] = v1;
3617 // v0 == valarray<char>("abcAeBgCijDlEnFp", 16)
3621 The fourth member operator selects those elements of the controlled sequence
3622 designated by <tt>boolarr</tt>. For example:
3625 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3626 valarray<char> v1("ABC", 3);
3627 const bool vb[] = {false, false, true, true, false, true};
3628 v0[valarray<bool>(vb, 6)] = v1;
3629 // v0 == valarray<char>("abABeCghijklmnop", 16)
3633 The fifth member operator selects those elements of the controlled sequence
3634 designated by indarr. For example:
3637 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3638 valarray<char> v1("ABCDE", 5);
3639 const size_t vi[] = {7, 5, 2, 3, 8};
3640 v0[valarray<size_t>(vi, 5)] = v1;
3641 // v0 == valarray<char>("abCDeBgAEjklmnop", 16)
3645 The second group of five member operators each construct an object that
3646 represents the value(s) selected. The selected elements must exist.
3650 The sixth member operator returns the value of element off. For example:
3653 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3654 // v0[3] returns 'd'
3658 The seventh member operator returns an object of class <tt>valarray<Ty></tt>
3659 containing those elements of the controlled sequence designated by <tt>slicearr</tt>.
3663 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3664 // v0[slice(2, 5, 3)] returns valarray<char>("cfilo", 5)
3668 The eighth member operator selects those elements of the controlled sequence
3669 designated by <tt>gslicearr</tt>. For example:
3672 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3673 const size_t lv[] = {2, 3};
3674 const size_t dv[] = {7, 2};
3675 const valarray<size_t> len(lv, 2), str(dv, 2);
3676 // v0[gslice(3, len, str)] returns
3677 // valarray<char>("dfhkmo", 6)
3681 The ninth member operator selects those elements of the controlled sequence
3682 designated by <tt>boolarr</tt>. For example:
3685 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3686 const bool vb[] = {false, false, true, true, false, true};
3687 // v0[valarray<bool>(vb, 6)] returns
3688 // valarray<char>("cdf", 3)
3692 The last member operator selects those elements of the controlled sequence
3693 designated by <tt>indarr</tt>. For example:
3696 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
3697 const size_t vi[] = {7, 5, 2, 3, 8};
3698 // v0[valarray<size_t>(vi, 5)] returns
3699 // valarray<char>("hfcdi", 5)
3709 <h3><a name="431"></a>431. Swapping containers with unequal allocators</h3>
3710 <p><b>Section:</b> 20.1.2 [allocator.requirements], 25 [algorithms] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3711 <b>Submitter:</b> Matt Austern <b>Date:</b> 2003-09-20</p>
3712 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#allocator.requirements">active issues</a> in [allocator.requirements].</p>
3713 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#allocator.requirements">issues</a> in [allocator.requirements].</p>
3714 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3715 <p><b>Discussion:</b></p>
3716 <p>Clause 20.1.2 [allocator.requirements] paragraph 4 says that implementations
3717 are permitted to supply containers that are unable to cope with
3718 allocator instances and that container implementations may assume
3719 that all instances of an allocator type compare equal. We gave
3720 implementers this latitude as a temporary hack, and eventually we
3721 want to get rid of it. What happens when we're dealing with
3722 allocators that <i>don't</i> compare equal?
3725 <p>In particular: suppose that <tt>v1</tt> and <tt>v2</tt> are both
3726 objects of type <tt>vector<int, my_alloc></tt> and that
3727 <tt>v1.get_allocator() != v2.get_allocator()</tt>. What happens if
3728 we write <tt>v1.swap(v2)</tt>? Informally, three possibilities:</p>
3730 <p>1. This operation is illegal. Perhaps we could say that an
3731 implementation is required to check and to throw an exception, or
3732 perhaps we could say it's undefined behavior.</p>
3733 <p>2. The operation performs a slow swap (i.e. using three
3734 invocations of <tt>operator=</tt>, leaving each allocator with its
3735 original container. This would be an O(N) operation.</p>
3736 <p>3. The operation swaps both the vectors' contents and their
3737 allocators. This would be an O(1) operation. That is:</p>
3739 <pre> my_alloc a1(...);
3743 vector<int, my_alloc> v1(a1);
3744 vector<int, my_alloc> v2(a2);
3745 assert(a1 == v1.get_allocator());
3746 assert(a2 == v2.get_allocator());
3749 assert(a1 == v2.get_allocator());
3750 assert(a2 == v1.get_allocator());
3754 <p><i>[Kona: This is part of a general problem. We need a paper
3755 saying how to deal with unequal allocators in general.]</i></p>
3758 <p><i>[pre-Sydney: Howard argues for option 3 in
3759 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1599.html">N1599</a>.
3764 2007-01-12, Howard: This issue will now tend to come up more often with move constructors
3765 and move assignment operators. For containers, these members transfer resources (i.e.
3766 the allocated memory) just like swap.
3771 Batavia: There is agreement to overload the container <tt>swap</tt> on the allocator's Swappable
3772 requirement using concepts. If the allocator supports Swappable, then container's swap will
3773 swap allocators, else it will perform a "slow swap" using copy construction and copy assignment.
3779 <p><b>Proposed resolution:</b></p>
3786 <h3><a name="446"></a>446. Iterator equality between different containers</h3>
3787 <p><b>Section:</b> 24.1 [iterator.requirements], 23.1 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3788 <b>Submitter:</b> Andy Koenig <b>Date:</b> 2003-12-16</p>
3789 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#iterator.requirements">active issues</a> in [iterator.requirements].</p>
3790 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iterator.requirements">issues</a> in [iterator.requirements].</p>
3791 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3792 <p><b>Discussion:</b></p>
3794 What requirements does the standard place on equality comparisons between
3795 iterators that refer to elements of different containers. For example, if
3796 v1 and v2 are empty vectors, is v1.end() == v2.end() allowed to yield true?
3797 Is it allowed to throw an exception?
3801 The standard appears to be silent on both questions.
3803 <p><i>[Sydney: The intention is that comparing two iterators from
3804 different containers is undefined, but it's not clear if we say that,
3805 or even whether it's something we should be saying in clause 23 or in
3806 clause 24. Intuitively we might want to say that equality is defined
3807 only if one iterator is reachable from another, but figuring out how
3808 to say it in any sensible way is a bit tricky: reachability is defined
3809 in terms of equality, so we can't also define equality in terms of
3816 <p><b>Proposed resolution:</b></p>
3824 <h3><a name="454"></a>454. basic_filebuf::open should accept wchar_t names</h3>
3825 <p><b>Section:</b> 27.8.1.4 [filebuf.members] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3826 <b>Submitter:</b> Bill Plauger <b>Date:</b> 2004-01-30</p>
3827 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#filebuf.members">issues</a> in [filebuf.members].</p>
3828 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
3829 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#105">105</a></p>
3830 <p><b>Discussion:</b></p>
3831 <pre> basic_filebuf *basic_filebuf::open(const char *, ios_base::open_mode);
3834 <p>should be supplemented with the overload:</p>
3836 <pre> basic_filebuf *basic_filebuf::open(const wchar_t *, ios_base::open_mode);
3840 Depending on the operating system, one of these forms is fundamental and
3841 the other requires an implementation-defined mapping to determine the
3845 <p><i>[Sydney: Yes, we want to allow wchar_t filenames. Bill will
3846 provide wording.]</i></p>
3850 In Toronto we noted that this is issue 5 from
3851 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1569.htm">N1569</a>.
3855 How does this interact with the newly-defined character types, and how
3856 do we avoid interface explosion considering <tt>std::string</tt> overloads that
3857 were added? Propose another solution that is different than the
3858 suggestion proposed by PJP.
3861 Suggestion is to make a member template function for <tt>basic_string</tt> (for
3862 <tt>char</tt>, <tt>wchar_t</tt>, <tt>u16char</tt>, <tt>u32char</tt> instantiations), and then just keep a
3863 <tt>const char*</tt> member.
3866 Goal is to do implicit conversion between character string literals to
3867 appropriate <tt>basic_string</tt> type. Not quite sure if this is possible.
3870 Implementors are free to add specific overloads for non-char character
3875 Martin adds pre-Sophia Antipolis:
3880 Please see <a href="http://wiki.dinkumware.com/twiki/pub/Wg21sophiaAntipolis/LibraryWorkingGroup/issue-454.html">issue 454: problems and solutions</a>.
3890 Beman is concerned that making these changes to <tt>basic_filebuf</tt> is not
3891 usefully changed unless <tt>fstream</tt> is also changed; this also only handles
3892 <tt>wchar_t</tt> and not other character types.
3895 The TR2 filesystem library is a more complete solution, but is not available soon.
3900 Martin adds: please reference
3901 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2683.html">N2683</a> for
3902 problems and solutions.
3908 <p><b>Proposed resolution:</b></p>
3912 <pre>basic_filebuf<charT,traits>* open(
3914 ios_base::openmode mode );
3918 Effects: If is_open() != false, returns a null pointer.
3919 Otherwise, initializes the filebuf as required. It then
3920 opens a file, if possible, whose name is the NTBS s ("as if"
3921 by calling std::fopen(s,modstr)).</p>
3927 <pre>basic_filebuf<charT,traits>* open(
3929 ios_base::openmode mode );
3931 basic_filebuf<charT,traits>* open(
3933 ios_base::openmode mode );
3937 Effects: If is_open() != false, returns a null pointer.
3938 Otherwise, initializes the filebuf as required. It then
3939 opens a file, if possible, whose name is the NTBS s ("as if"
3940 by calling std::fopen(s,modstr)).
3941 For the second signature, the NTBS s is determined from the
3942 WCBS ws in an implementation-defined manner.
3946 (NOTE: For a system that "naturally" represents a filename
3947 as a WCBS, the NTBS s in the first signature may instead
3948 be mapped to a WCBS; if so, it follows the same mapping
3949 rules as the first argument to open.)
3955 <p><b>Rationale:</b></p>
3957 Slightly controversial, but by a 7-1 straw poll the LWG agreed to move
3958 this to Ready. The controversy was because the mapping between wide
3959 names and files in a filesystem is implementation defined. The
3960 counterargument, which most but not all LWG members accepted, is that
3961 the mapping between narrow files names and files is also
3962 implemenation defined.</p>
3964 <p><i>[Lillehammer: Moved back to "open" status, at Beman's urging.
3965 (1) Why just basic_filebuf, instead of also basic_fstream (and
3966 possibly other things too). (2) Why not also constructors that take
3967 std::basic_string? (3) We might want to wait until we see Beman's
3968 filesystem library; we might decide that it obviates this.]</i></p>
3978 Move again to Ready.
3981 There is a timing issue here. Since the filesystem library will not be
3982 in C++0x, this should be brought forward. This solution would remain
3983 valid in the context of the proposed filesystem.
3986 This issue has been kicking around for a while, and the wchar_t addition
3987 alone would help many users. Thus, we suggest putting this on the
3988 reflector list with an invitation for someone to produce proposed
3989 wording that covers basic_fstream. In the meantime, we suggest that the
3990 proposed wording be adopted as-is.
3993 If more of the Lillehammer questions come back, they should be
3994 introduced as separate issues.
4006 <h3><a name="458"></a>458. 24.1.5 contains unintented limitation for operator-</h3>
4007 <p><b>Section:</b> 24.1.5 [random.access.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4008 <b>Submitter:</b> Daniel Frey <b>Date:</b> 2004-02-27</p>
4009 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#random.access.iterators">issues</a> in [random.access.iterators].</p>
4010 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4011 <p><b>Discussion:</b></p>
4013 In 24.1.5 [lib.random.access.iterators], table 76 the operational
4014 semantics for the expression "r -= n" are defined as "return r += -n".
4015 This means, that the expression -n must be valid, which is not the case
4020 Sydney: Possibly not a real problem, since difference type is required
4021 to be a signed integer type. However, the wording in the standard may
4022 be less clear than we would like.
4028 <p><b>Proposed resolution:</b></p>
4030 To remove this limitation, I suggest to change the
4031 operational semantics for this column to:
4033 <blockquote><pre> { Distance m = n;
4047 <h3><a name="459"></a>459. Requirement for widening in stage 2 is overspecification</h3>
4048 <p><b>Section:</b> 22.2.2.1.2 [facet.num.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4049 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2004-03-16</p>
4050 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#facet.num.get.virtuals">active issues</a> in [facet.num.get.virtuals].</p>
4051 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#facet.num.get.virtuals">issues</a> in [facet.num.get.virtuals].</p>
4052 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4053 <p><b>Discussion:</b></p>
4054 <p>When parsing strings of wide-character digits, the standard
4055 requires the library to widen narrow-character "atoms" and compare
4056 the widened atoms against the characters that are being parsed.
4057 Simply narrowing the wide characters would be far simpler, and
4058 probably more efficient. The two choices are equivalent except in
4059 convoluted test cases, and many implementations already ignore the
4060 standard and use narrow instead of widen.</p>
4063 First, I disagree that using narrow() instead of widen() would
4064 necessarily have unfortunate performance implications. A possible
4065 implementation of narrow() that allows num_get to be implemented
4066 in a much simpler and arguably comparably efficient way as calling
4067 widen() allows, i.e. without making a virtual call to do_narrow every
4068 time, is as follows:
4071 <pre> inline char ctype<wchar_t>::narrow (wchar_t wc, char dflt) const
4073 const unsigned wi = unsigned (wc);
4075 if (wi > UCHAR_MAX)
4076 return typeid (*this) == typeid (ctype<wchar_t>) ?
4077 dflt : do_narrow (wc, dflt);
4079 if (narrow_ [wi] < 0) {
4080 const char nc = do_narrow (wc, dflt);
4086 return char (narrow_ [wi]);
4091 Second, I don't think the change proposed in the issue (i.e., to use
4092 narrow() instead of widen() during Stage 2) would be at all
4093 drastic. Existing implementations with the exception of libstdc++
4094 currently already use narrow() so the impact of the change on programs
4095 would presumably be isolated to just a single implementation. Further,
4096 since narrow() is not required to translate alternate wide digit
4097 representations such as those mentioned in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#303">303</a>
4099 their narrow equivalents (i.e., the portable source characters '0'
4100 through '9'), the change does not necessarily imply that these
4101 alternate digits would be treated as ordinary digits and accepted as
4102 part of numbers during parsing. In fact, the requirement in 22.2.1.1.2
4103 [locale.ctype.virtuals], p13 forbids narrow() to translate an alternate
4104 digit character, wc, to an ordinary digit in the basic source
4105 character set unless the expression
4106 (ctype<charT>::is(ctype_base::digit, wc) == true) holds. This in
4107 turn is prohibited by the C standard (7.25.2.1.5, 7.25.2.1.5, and
4108 5.2.1, respectively) for charT of either char or wchar_t.
4111 <p><i>[Sydney: To a large extent this is a nonproblem. As long as
4112 you're only trafficking in char and wchar_t we're only dealing with a
4113 stable character set, so you don't really need either 'widen' or
4114 'narrow': can just use literals. Finally, it's not even clear whether
4115 widen-vs-narrow is the right question; arguably we should be using
4116 codecvt instead.]</i></p>
4121 <p><b>Proposed resolution:</b></p>
4122 <p>Change stage 2 so that implementations are permitted to use either
4123 technique to perform the comparison:</p>
4125 <li> call widen on the atoms and compare (either by using
4126 operator== or char_traits<charT>::eq) the input with
4127 the widened atoms, or</li>
4128 <li> call narrow on the input and compare the narrow input
4130 <li> do (1) or (2) only if charT is not char or wchar_t,
4131 respectively; i.e., avoid calling widen or narrow
4132 if it the source and destination types are the same</li>
4140 <h3><a name="463"></a>463. auto_ptr usability issues</h3>
4141 <p><b>Section:</b> D.9.1 [auto.ptr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4142 <b>Submitter:</b> Rani Sharoni <b>Date:</b> 2003-12-07</p>
4143 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#auto.ptr">issues</a> in [auto.ptr].</p>
4144 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4145 <p><b>Discussion:</b></p>
4148 TC1 CWG DR #84 effectively made the template<class Y> operator auto_ptr<Y>()
4149 member of auto_ptr (20.4.5.3/4) obsolete.
4153 The sole purpose of this obsolete conversion member is to enable copy
4154 initialization base from r-value derived (or any convertible types like
4157 <pre>#include <memory>
4158 using std::auto_ptr;
4163 auto_ptr<D> source();
4164 int sink(auto_ptr<B>);
4165 int x1 = sink( source() ); // #1 EDG - no suitable copy constructor
4169 The excellent analysis of conversion operations that was given in the final
4171 (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1128.pdf)
4172 explicitly specifies this case analysis (case 4). DR #84 makes the analysis
4173 wrong and actually comes to forbid the loophole that was exploited by the
4178 I didn't encounter any compliant compiler (e.g. EDG, GCC, BCC and VC) that
4179 ever allowed this case. This is probably because it requires 3 user defined
4180 conversions and in fact current compilers conform to DR #84.
4184 I was surprised to discover that the obsolete conversion member actually has
4185 negative impact of the copy initialization base from l-value derived
4187 <pre>auto_ptr<D> dp;
4188 int x2 = sink(dp); // #2 EDG - more than one user-defined conversion applies
4192 I'm sure that the original intention was allowing this initialization using
4193 the template<class Y> auto_ptr(auto_ptr<Y>& a) constructor (20.4.5.1/4) but
4194 since in this copy initialization it's merely user defined conversion (UDC)
4195 and the obsolete conversion member is UDC with the same rank (for the early
4196 overloading stage) there is an ambiguity between them.
4200 Removing the obsolete member will have impact on code that explicitly
4203 <pre>int y = sink(source().operator auto_ptr<B>());
4207 IMHO no one ever wrote such awkward code and the reasonable workaround for
4210 <pre>int y = sink( auto_ptr<B>(source()) );
4214 I was even more surprised to find out that after removing the obsolete
4215 conversion member the initialization was still ill-formed:
4216 int x3 = sink(dp); // #3 EDG - no suitable copy constructor
4220 This copy initialization semantically requires copy constructor which means
4221 that both template conversion constructor and the auto_ptr_ref conversion
4222 member (20.4.5.3/3) are required which is what was explicitly forbidden in
4223 DR #84. This is a bit amusing case in which removing ambiguity results with
4228 I also found exception safety issue with auto_ptr related to auto_ptr_ref:
4230 <pre>int f(auto_ptr<B>, std::string);
4231 auto_ptr<B> source2();
4233 // string constructor throws while auto_ptr_ref
4234 // "holds" the pointer
4235 int x4 = f(source2(), "xyz"); // #4
4239 The theoretic execution sequence that will cause a leak:
4242 <li>call auto_ptr<B>::operator auto_ptr_ref<B>()</li>
4243 <li>call string::string(char const*) and throw</li>
4247 According to 20.4.5.3/3 and 20.4.5/2 the auto_ptr_ref conversion member
4248 returns auto_ptr_ref<Y> that holds *this and this is another defect since
4249 the type of *this is auto_ptr<X> where X might be different from Y. Several
4250 library vendors (e.g. SGI) implement auto_ptr_ref<Y> with Y* as member which
4251 is much more reasonable. Other vendor implemented auto_ptr_ref as
4252 defectively required and it results with awkward and catastrophic code:
4253 int oops = sink(auto_ptr<B>(source())); // warning recursive on all control
4258 Dave Abrahams noticed that there is no specification saying that
4259 auto_ptr_ref copy constructor can't throw.
4263 My proposal comes to solve all the above issues and significantly simplify
4264 auto_ptr implementation. One of the fundamental requirements from auto_ptr
4265 is that it can be constructed in an intuitive manner (i.e. like ordinary
4266 pointers) but with strict ownership semantics which yield that source
4267 auto_ptr in initialization must be non-const. My idea is to add additional
4268 constructor template with sole propose to generate ill-formed, diagnostic
4269 required, instance for const auto_ptr arguments during instantiation of
4270 declaration. This special constructor will not be instantiated for other
4271 types which is achievable using 14.8.2/2 (SFINAE). Having this constructor
4272 in hand makes the constructor template<class Y> auto_ptr(auto_ptr<Y> const&)
4273 legitimate since the actual argument can't be const yet non const r-value
4278 This implementation technique makes the "private auxiliary class"
4279 auto_ptr_ref obsolete and I found out that modern C++ compilers (e.g. EDG,
4280 GCC and VC) consume the new implementation as expected and allow all
4281 intuitive initialization and assignment cases while rejecting illegal cases
4282 that involve const auto_ptr arguments.
4285 <p>The proposed auto_ptr interface:</p>
4287 <pre>namespace std {
4288 template<class X> class auto_ptr {
4290 typedef X element_type;
4292 // 20.4.5.1 construct/copy/destroy:
4293 explicit auto_ptr(X* p=0) throw();
4294 auto_ptr(auto_ptr&) throw();
4295 template<class Y> auto_ptr(auto_ptr<Y> const&) throw();
4296 auto_ptr& operator=(auto_ptr&) throw();
4297 template<class Y> auto_ptr& operator=(auto_ptr<Y>) throw();
4298 ~auto_ptr() throw();
4300 // 20.4.5.2 members:
4301 X& operator*() const throw();
4302 X* operator->() const throw();
4303 X* get() const throw();
4304 X* release() throw();
4305 void reset(X* p=0) throw();
4308 template<class U>
4309 auto_ptr(U& rhs, typename
4310 unspecified_error_on_const_auto_ptr<U>::type = 0);
4316 One compliant technique to implement the unspecified_error_on_const_auto_ptr
4317 helper class is using additional private auto_ptr member class template like
4320 <pre>template<typename T> struct unspecified_error_on_const_auto_ptr;
4322 template<typename T>
4323 struct unspecified_error_on_const_auto_ptr<auto_ptr<T> const>
4324 { typedef typename auto_ptr<T>::const_auto_ptr_is_not_allowed type; };
4328 There are other techniques to implement this helper class that might work
4329 better for different compliers (i.e. better diagnostics) and therefore I
4330 suggest defining its semantic behavior without mandating any specific
4331 implementation. IMO, and I didn't found any compiler that thinks otherwise,
4332 14.7.1/5 doesn't theoretically defeat the suggested technique but I suggest
4333 verifying this with core language experts.
4336 <p><b>Further changes in standard text:</b></p>
4337 <p>Remove section 20.4.5.3</p>
4339 <p>Change 20.4.5/2 to read something like:
4340 Initializing auto_ptr<X> from const auto_ptr<Y> will result with unspecified
4341 ill-formed declaration that will require unspecified diagnostic.</p>
4343 <p>Change 20.4.5.1/4,5,6 to read:</p>
4345 <pre>template<class Y> auto_ptr(auto_ptr<Y> const& a) throw();</pre>
4346 <p> 4 Requires: Y* can be implicitly converted to X*.</p>
4347 <p> 5 Effects: Calls const_cast<auto_ptr<Y>&>(a).release().</p>
4348 <p> 6 Postconditions: *this holds the pointer returned from a.release().</p>
4350 <p>Change 20.4.5.1/10</p>
4351 <pre>template<class Y> auto_ptr& operator=(auto_ptr<Y> a) throw();
4354 10 Requires: Y* can be implicitly converted to X*. The expression delete
4355 get() is well formed.
4358 <p>LWG TC DR #127 is obsolete.</p>
4361 Notice that the copy constructor and copy assignment operator should remain
4362 as before and accept non-const auto_ptr& since they have effect on the form
4363 of the implicitly declared copy constructor and copy assignment operator of
4364 class that contains auto_ptr as member per 12.8/5,10:
4367 // implicit X(X&)
4368 // implicit X& operator=(X&)
4369 auto_ptr<D> aptr_;
4374 In most cases this indicates about sloppy programming but preserves the
4375 current auto_ptr behavior.
4379 Dave Abrahams encouraged me to suggest fallback implementation in case that
4380 my suggestion that involves removing of auto_ptr_ref will not be accepted.
4381 In this case removing the obsolete conversion member to auto_ptr<Y> and
4382 20.4.5.3/4,5 is still required in order to eliminate ambiguity in legal
4383 cases. The two constructors that I suggested will co exist with the current
4384 members but will make auto_ptr_ref obsolete in initialization contexts.
4385 auto_ptr_ref will be effective in assignment contexts as suggested in DR
4386 #127 and I can't see any serious exception safety issues in those cases
4387 (although it's possible to synthesize such). auto_ptr_ref<X> semantics will
4388 have to be revised to say that it strictly holds pointer of type X and not
4389 reference to an auto_ptr for the favor of cases in which auto_ptr_ref<Y> is
4390 constructed from auto_ptr<X> in which X is different from Y (i.e. assignment
4391 from r-value derived to base).
4394 <p><i>[Redmond: punt for the moment. We haven't decided yet whether we
4395 want to fix auto_ptr for C++-0x, or remove it and replace it with
4396 move_ptr and unique_ptr.]</i></p>
4400 Oxford 2007: Recommend NAD. We're just going to deprecate it. It still works for simple use cases
4401 and people know how to deal with it. Going forward <tt>unique_ptr</tt> is the recommended
4407 2007-11-09: Reopened at the request of David Abrahams, Alisdair Meredith and Gabriel Dos Reis.
4413 <p><b>Proposed resolution:</b></p>
4415 Change the synopsis in D.9.1 [auto.ptr]:
4418 <blockquote><pre>namespace std {
4419 <del>template <class Y> struct auto_ptr_ref {};</del>
4421 <ins>// exposition only</ins>
4422 <ins>template <class T> struct constant_object;</ins>
4424 <ins>// exposition only</ins>
4425 <ins>template <class T></ins>
4426 <ins>struct cannot_transfer_ownership_from</ins>
4427 <ins>: constant_object<T> {};</ins>
4429 template <class X> class auto_ptr {
4431 typedef X element_type;
4433 // D.9.1.1 construct/copy/destroy:
4434 explicit auto_ptr(X* p =0) throw();
4435 auto_ptr(auto_ptr&) throw();
4436 template<class Y> auto_ptr(auto_ptr<Y><ins> const</ins>&) throw();
4437 auto_ptr& operator=(auto_ptr&) throw();
4438 template<class Y> auto_ptr& operator=(auto_ptr<Y><del>&</del>) throw();
4439 <del>auto_ptr& operator=(auto_ptr_ref<X> r) throw();</del>
4440 ~auto_ptr() throw();
4443 X& operator*() const throw();
4444 X* operator->() const throw();
4445 X* get() const throw();
4446 X* release() throw();
4447 void reset(X* p =0) throw();
4449 <del>// D.9.1.3 conversions:</del>
4450 <del>auto_ptr(auto_ptr_ref<X>) throw();</del>
4451 <del>template<class Y> operator auto_ptr_ref<Y>() throw();</del>
4452 <del>template<class Y> operator auto_ptr<Y>() throw();</del>
4454 <ins>// exposition only</ins>
4455 <ins>template<class U></ins>
4456 <ins>auto_ptr(U& rhs, typename cannot_transfer_ownership_from<U>::error = 0);</ins>
4459 template <> class auto_ptr<void>
4462 typedef void element_type;
4469 Remove D.9.1.3 [auto.ptr.conv].
4473 Change D.9.1 [auto.ptr], p3:
4477 The <tt>auto_ptr</tt> provides a semantics of strict ownership. An
4478 <tt>auto_ptr</tt> owns the object it holds a pointer to. Copying an
4479 <tt>auto_ptr</tt> copies the pointer and transfers ownership to the
4480 destination. If more than one <tt>auto_ptr</tt> owns the same object at
4481 the same time the behavior of the program is undefined. <ins>Templates
4482 <tt>constant_object</tt> and <tt>cannot_transfer_ownership_from</tt>,
4483 and the final constructor of <tt>auto_ptr</tt> are for exposition only.
4484 For any types <tt>X</tt> and <tt>Y</tt>, initializing
4485 <tt>auto_ptr<X></tt> from <tt>const auto_ptr<Y></tt> is
4486 ill-formed, diagnostic required.</ins> [<i>Note:</i> The uses of
4487 <tt>auto_ptr</tt> include providing temporary exception-safety for
4488 dynamically allocated memory, passing ownership of dynamically allocated
4489 memory to a function, and returning dynamically allocated memory from a
4490 function. <tt>auto_ptr</tt> does not meet the <tt>CopyConstructible</tt>
4491 and <tt>Assignable</tt> requirements for Standard Library container
4492 elements and thus instantiating a Standard Library container with an
4493 <tt>auto_ptr</tt> results in undefined behavior. <i>-- end note</i>]
4497 Change D.9.1.1 [auto.ptr.cons], p5:
4501 <pre>template<class Y> auto_ptr(auto_ptr<Y><ins> const</ins>& a) throw();
4505 <i>Requires:</i> <tt>Y*</tt> can be implicitly converted to <tt>X*</tt>.
4508 <i>Effects:</i> Calls <ins><tt>const_cast<auto_ptr<Y>&>(</tt></ins><tt>a</tt><ins><tt>)</tt></ins><tt>.release()</tt>.
4511 <i>Postconditions:</i> <tt>*this</tt> holds the pointer returned from <tt>a.release()</tt>.
4517 Change D.9.1.1 [auto.ptr.cons], p10:
4521 <pre>template<class Y> auto_ptr& operator=(auto_ptr<Y><del>&</del> a) throw();
4525 <i>Requires:</i> <tt>Y*</tt> can be implicitly converted to <tt>X*</tt>.
4526 The expression <tt>delete get()</tt> is well formed.
4529 <i>Effects:</i> Calls <tt>reset(a.release())</tt>.
4532 <i>Returns:</i> <tt>*this</tt>.
4543 <h3><a name="471"></a>471. result of what() implementation-defined</h3>
4544 <p><b>Section:</b> 18.6.1 [type.info] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4545 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2004-06-28</p>
4546 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#type.info">issues</a> in [type.info].</p>
4547 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4548 <p><b>Discussion:</b></p>
4550 <p>[lib.exception] specifies the following:</p>
4551 <pre> exception (const exception&) throw();
4552 exception& operator= (const exception&) throw();
4554 -4- Effects: Copies an exception object.
4555 -5- Notes: The effects of calling what() after assignment
4556 are implementation-defined.
4560 First, does the Note only apply to the assignment operator? If so,
4561 what are the effects of calling what() on a copy of an object? Is
4562 the returned pointer supposed to point to an identical copy of
4563 the NTBS returned by what() called on the original object or not?
4567 Second, is this Note intended to extend to all the derived classes
4568 in section 19? I.e., does the standard provide any guarantee for
4569 the effects of what() called on a copy of any of the derived class
4570 described in section 19?
4574 Finally, if the answer to the first question is no, I believe it
4575 constitutes a defect since throwing an exception object typically
4576 implies invoking the copy ctor on the object. If the answer is yes,
4577 then I believe the standard ought to be clarified to spell out
4578 exactly what the effects are on the copy (i.e., after the copy
4582 <p><i>[Redmond: Yes, this is fuzzy. The issue of derived classes is
4587 Batavia: Howard provided wording.
4598 Eric concerned this is unimplementable, due to nothrow guarantees.
4599 Suggested implementation would involve reference counting.
4602 Is the implied reference counting subtle enough to call out a note on
4603 implementation? Probably not.
4606 If reference counting required, could we tighten specification further
4607 to require same pointer value? Probably an overspecification, especially
4608 if exception classes defer evalutation of final string to calls to
4612 Remember issue moved open and not resolved at Batavia, but cannot
4613 remember who objected to canvas a disenting opinion - please speak up if
4614 you disagree while reading these minutes!
4617 Move to Ready as we are accepting words unmodified.
4627 The issue was pulled from Ready. It needs to make clear that only homogenous copying
4628 is intended to be supported. Not coping from a dervied to a base.
4634 <p><b>Proposed resolution:</b></p>
4637 Change 18.7.1 [exception] to:
4641 <pre>exception(const exception& <ins><i>e</i></ins>) throw();
4642 exception& operator=(const exception& <ins><i>e</i></ins>) throw();</pre>
4645 -4- <i>Effects:</i> Copies an exception object.
4648 <del> -5- <i>Remarks:</i> The effects of calling what() after assignment are implementation-defined.</del>
4651 <ins>-5- <i>Throws:</i> Nothing. This also applies
4652 to all standard library-defined classes that derive from <tt>exception</tt>.</ins>
4655 <ins>-7- <i>Postcondition:</i> <tt>strcmp(what(), <i>e</i>.what()) == 0</tt>. This also applies
4656 to all standard library-defined classes that derive from <tt>exception</tt>.</ins>
4666 <h3><a name="473"></a>473. underspecified ctype calls</h3>
4667 <p><b>Section:</b> 22.2.1.1 [locale.ctype] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4668 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2004-07-01</p>
4669 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4670 <p><b>Discussion:</b></p>
4672 Most ctype member functions come in two forms: one that operates
4673 on a single character at a time and another form that operates
4674 on a range of characters. Both forms are typically described by
4675 a single Effects and/or Returns clause.
4678 The Returns clause of each of the single-character non-virtual forms
4679 suggests that the function calls the corresponding single character
4680 virtual function, and that the array form calls the corresponding
4681 virtual array form. Neither of the two forms of each virtual member
4682 function is required to be implemented in terms of the other.
4685 There are three problems:
4688 1. One is that while the standard does suggest that each non-virtual
4689 member function calls the corresponding form of the virtual function,
4690 it doesn't actually explicitly require it.
4693 Implementations that cache results from some of the virtual member
4694 functions for some or all values of their arguments might want to
4695 call the array form from the non-array form the first time to fill
4696 the cache and avoid any or most subsequent virtual calls. Programs
4697 that rely on each form of the virtual function being called from
4698 the corresponding non-virtual function will see unexpected behavior
4699 when using such implementations.
4702 2. The second problem is that either form of each of the virtual
4703 functions can be overridden by a user-defined function in a derived
4704 class to return a value that is different from the one produced by
4705 the virtual function of the alternate form that has not been
4709 Thus, it might be possible for, say, ctype::widen(c) to return one
4710 value, while for ctype::widen(&c, &c + 1, &wc) to set
4711 wc to another value. This is almost certainly not intended. Both
4712 forms of every function should be required to return the same result
4713 for the same character, otherwise the same program using an
4714 implementation that calls one form of the functions will behave
4715 differently than when using another implementation that calls the
4716 other form of the function "under the hood."
4719 3. The last problem is that the standard text fails to specify whether
4720 one form of any of the virtual functions is permitted to be implemented
4721 in terms of the other form or not, and if so, whether it is required
4722 or permitted to call the overridden virtual function or not.
4725 Thus, a program that overrides one of the virtual functions so that
4726 it calls the other form which then calls the base member might end
4727 up in an infinite loop if the called form of the base implementation
4728 of the function in turn calls the other form.
4731 Lillehammer: Part of this isn't a real problem. We already talk about
4732 caching. 22.1.1/6 But part is a real problem. ctype virtuals may call
4733 each other, so users don't know which ones to override to avoid avoid
4736 <p>This is a problem for all facet virtuals, not just ctype virtuals,
4737 so we probably want a blanket statement in clause 22 for all
4738 facets. The LWG is leaning toward a blanket prohibition, that a
4739 facet's virtuals may never call each other. We might want to do that
4740 in clause 27 too, for that matter. A review is necessary. Bill will
4741 provide wording.</p>
4744 <p><b>Proposed resolution:</b></p>
4750 <h3><a name="484"></a>484. Convertible to T</h3>
4751 <p><b>Section:</b> 24.1.1 [input.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4752 <b>Submitter:</b> Chris Jefferson <b>Date:</b> 2004-09-16</p>
4753 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#input.iterators">issues</a> in [input.iterators].</p>
4754 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4755 <p><b>Discussion:</b></p>
4756 <p>From comp.std.c++:</p>
4759 I note that given an input iterator a for type T,
4760 then *a only has to be "convertable to T", not actually of type T.
4763 <p>Firstly, I can't seem to find an exact definition of "convertable to T".
4764 While I assume it is the obvious definition (an implicit conversion), I
4765 can't find an exact definition. Is there one?</p>
4767 <p>Slightly more worryingly, there doesn't seem to be any restriction on
4768 the this type, other than it is "convertable to T". Consider two input
4769 iterators a and b. I would personally assume that most people would
4770 expect *a==*b would perform T(*a)==T(*b), however it doesn't seem that
4771 the standard requires that, and that whatever type *a is (call it U)
4772 could have == defined on it with totally different symantics and still
4773 be a valid inputer iterator.</p>
4775 <p>Is this a correct reading? When using input iterators should I write
4776 T(*a) all over the place to be sure that the object i'm using is the
4779 <p>This is especially a nuisance for operations that are defined to be
4780 "convertible to bool". (This is probably allowed so that
4781 implementations could return say an int and avoid an unnessary
4782 conversion. However all implementations I have seen simply return a
4783 bool anyway. Typical implemtations of STL algorithms just write
4784 things like <tt>while(a!=b && *a!=0)</tt>. But strictly
4785 speaking, there are lots of types that are convertible to T but
4786 that also overload the appropriate operators so this doesn't behave
4789 <p>If we want to make code like this legal (which most people seem to
4790 expect), then we'll need to tighten up what we mean by "convertible
4793 <p><i>[Lillehammer: The first part is NAD, since "convertible" is
4794 well-defined in core. The second part is basically about pathological
4795 overloads. It's a minor problem but a real one. So leave open for
4796 now, hope we solve it as part of iterator redesign.]</i></p>
4800 <p><b>Proposed resolution:</b></p>
4807 <h3><a name="485"></a>485. output iterator insufficently constrained</h3>
4808 <p><b>Section:</b> 24.1.2 [output.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4809 <b>Submitter:</b> Chris Jefferson <b>Date:</b> 2004-10-13</p>
4810 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#output.iterators">issues</a> in [output.iterators].</p>
4811 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4812 <p><b>Discussion:</b></p>
4814 The note on 24.1.2 Output iterators insufficently limits what can be
4815 performed on output iterators. While it requires that each iterator is
4816 progressed through only once and that each iterator is written to only
4817 once, it does not require the following things:</p>
4819 <p>Note: Here it is assumed that x is an output iterator of type X which
4820 has not yet been assigned to.</p>
4822 <p>a) That each value of the output iterator is written to:
4823 The standard allows:
4828 b) That assignments to the output iterator are made in order
4829 X a(x); ++a; *a=1; *x=2; is allowed
4833 c) Chains of output iterators cannot be constructed:
4834 X a(x); ++a; X b(a); ++b; X c(b); ++c; is allowed, and under the current
4835 wording (I believe) x,a,b,c could be written to in any order.
4838 <p>I do not believe this was the intension of the standard?</p>
4839 <p><i>[Lillehammer: Real issue. There are lots of constraints we
4840 intended but didn't specify. Should be solved as part of iterator
4845 <p><b>Proposed resolution:</b></p>
4852 <h3><a name="492"></a>492. Invalid iterator arithmetic expressions</h3>
4853 <p><b>Section:</b> 23 [containers], 24 [iterators], 25 [algorithms] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4854 <b>Submitter:</b> Thomas Mang <b>Date:</b> 2004-12-12</p>
4855 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#containers">active issues</a> in [containers].</p>
4856 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#containers">issues</a> in [containers].</p>
4857 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
4858 <p><b>Discussion:</b></p>
4859 <p>Various clauses other than clause 25 make use of iterator arithmetic not
4860 supported by the iterator category in question.
4861 Algorithms in clause 25 are exceptional because of 25 [lib.algorithms],
4862 paragraph 9, but this paragraph does not provide semantics to the
4863 expression "iterator - n", where n denotes a value of a distance type
4864 between iterators.</p>
4866 <p>1) Examples of current wording:</p>
4868 <p>Current wording outside clause 25:</p>
4871 23.2.2.4 [lib.list.ops], paragraphs 19-21: "first + 1", "(i - 1)",
4873 23.3.1.1 [lib.map.cons], paragraph 4: "last - first"
4874 23.3.2.1 [lib.multimap.cons], paragraph 4: "last - first"
4875 23.3.3.1 [lib.set.cons], paragraph 4: "last - first"
4876 23.3.4.1 [lib.multiset.cons], paragraph 4: "last - first"
4877 24.4.1 [lib.reverse.iterators], paragraph 1: "(i - 1)"
4881 [Important note: The list is not complete, just an illustration. The
4882 same issue might well apply to other paragraphs not listed here.]</p>
4884 <p>None of these expressions is valid for the corresponding iterator
4887 <p>Current wording in clause 25:</p>
4890 25.1.1 [lib.alg.foreach], paragraph 1: "last - 1"
4891 25.1.3 [lib.alg.find.end], paragraph 2: "[first1, last1 -
4893 25.2.8 [lib.alg.unique], paragraph 1: "(i - 1)"
4894 25.2.8 [lib.alg.unique], paragraph 5: "(i - 1)"
4898 However, current wording of 25 [lib.algorithms], paragraph 9 covers
4899 neither of these four cases:</p>
4901 <p>Current wording of 25 [lib.algorithms], paragraph 9:</p>
4904 "In the description of the algorithms operator + and - are used for some
4905 of the iterator categories for which they do not have to be defined. In
4906 these cases the semantics of a+n is the same as that of</p>
4912 <p>and that of b-a is the same as of return distance(a, b)"</p>
4915 This paragrpah does not take the expression "iterator - n" into account,
4916 where n denotes a value of a distance type between two iterators [Note:
4917 According to current wording, the expression "iterator - n" would be
4918 resolved as equivalent to "return distance(n, iterator)"]. Even if the
4919 expression "iterator - n" were to be reinterpreted as equivalent to
4920 "iterator + -n" [Note: This would imply that "a" and "b" were
4921 interpreted implicitly as values of iterator types, and "n" as value of
4922 a distance type], then 24.3.4/2 interfers because it says: "Requires: n
4923 may be negative only for random access and bidirectional iterators.",
4924 and none of the paragraphs quoted above requires the iterators on which
4925 the algorithms operate to be of random access or bidirectional category.
4928 <p>2) Description of intended behavior:</p>
4931 For the rest of this Defect Report, it is assumed that the expression
4932 "iterator1 + n" and "iterator1 - iterator2" has the semantics as
4933 described in current 25 [lib.algorithms], paragraph 9, but applying to
4934 all clauses. The expression "iterator1 - n" is equivalent to an
4935 result-iterator for which the expression "result-iterator + n" yields an
4936 iterator denoting the same position as iterator1 does. The terms
4937 "iterator1", "iterator2" and "result-iterator" shall denote the value of
4938 an iterator type, and the term "n" shall denote a value of a distance
4939 type between two iterators.</p>
4942 All implementations known to the author of this Defect Report comply
4943 with these assumptions.
4944 No impact on current code is expected.</p>
4946 <p>3) Proposed fixes:</p>
4949 <p>Change 25 [lib.algorithms], paragraph 9 to:</p>
4952 "In the description of the algorithms operator + and - are used for some
4953 of the iterator categories for which they do not have to be defined. In
4954 this paragraph, a and b denote values of an iterator type, and n denotes
4955 a value of a distance type between two iterators. In these cases the
4956 semantics of a+n is the same as that of</p>
4962 <p>,the semantics of a-n denotes the value of an iterator i for which the
4963 following condition holds:
4965 and that of b-a is the same as of
4966 return distance(a, b)".
4969 <p>Comments to the new wording:</p>
4972 a) The wording " In this paragraph, a and b denote values of an iterator
4973 type, and n denotes a value of a distance type between two iterators."
4974 was added so the expressions "b-a" and "a-n" are distinguished regarding
4975 the types of the values on which they operate.
4976 b) The wording ",the semantics of a-n denotes the value of an iterator i
4977 for which the following condition holds: advance(i, n) == a" was added
4978 to cover the expression 'iterator - n'. The wording "advance(i, n) == a"
4979 was used to avoid a dependency on the semantics of a+n, as the wording
4980 "i + n == a" would have implied. However, such a dependency might well
4982 c) DR 225 is not considered in the new wording.
4986 Proposed fixes regarding invalid iterator arithmetic expressions outside
4991 a) Move modified 25 [lib.algorithms], paragraph 9 (as proposed above)
4992 before any current invalid iterator arithmetic expression. In that case,
4993 the first sentence of 25 [lib.algorithms], paragraph 9, need also to be
4994 modified and could read: "For the rest of this International Standard,
4995 ...." / "In the description of the following clauses including this
4996 ...." / "In the description of the text below ..." etc. - anyways
4997 substituting the wording "algorithms", which is a straight reference to
4999 In that case, 25 [lib.algorithms] paragraph 9 will certainly become
5002 b) Add an appropiate paragraph similar to resolved 25 [lib.algorithms],
5003 paragraph 9, to the beginning of each clause containing invalid iterator
5004 arithmetic expressions.
5006 c) Fix each paragraph (both current wording and possible resolutions of
5007 DRs) containing invalid iterator arithmetic expressions separately.
5010 <p>5) References to other DRs:</p>
5014 See DR 237. The resolution could then also read "Linear in last -
5024 Keep open and ask Bill to provide wording.
5028 <p><b>Proposed resolution:</b></p>
5030 <p><i>[Lillehammer: Minor issue, but real. We have a blanket statement
5031 about this in 25/11. But (a) it should be in 17, not 25; and (b) it's
5032 not quite broad enough, because there are some arithmetic expressions
5033 it doesn't cover. Bill will provide wording.]</i></p>
5042 <h3><a name="498"></a>498. Requirements for partition() and stable_partition() too strong</h3>
5043 <p><b>Section:</b> 25.2.13 [alg.partitions] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5044 <b>Submitter:</b> Sean Parent, Joe Gottman <b>Date:</b> 2005-05-04</p>
5045 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5046 <p><b>Discussion:</b></p>
5049 The iterator requirements for partition() and stable_partition() [25.2.12]
5050 are listed as BidirectionalIterator, however, there are efficient algorithms
5051 for these functions that only require ForwardIterator that have been known
5052 since before the standard existed. The SGI implementation includes these (see
5053 <a href="http://www.sgi.com/tech/stl/partition.html">http://www.sgi.com/tech/stl/partition.html</a>
5055 <a href="http://www.sgi.com/tech/stl/stable_partition.html">http://www.sgi.com/tech/stl/stable_partition.html</a>).
5059 <p><b>Proposed resolution:</b></p>
5061 Change 25.2.12 from </p>
5062 <blockquote><pre>template<class BidirectionalIterator, class Predicate>
5063 BidirectionalIterator partition(BidirectionalIterato r first,
5064 BidirectionalIterator last,
5068 <blockquote><pre>template<class ForwardIterator, class Predicate>
5069 ForwardIterator partition(ForwardIterator first,
5070 ForwardIterator last,
5073 <p>Change the complexity from </p>
5076 At most (last - first)/2 swaps are done. Exactly (last - first)
5077 applications of the predicate are done.
5083 If ForwardIterator is a bidirectional_iterator, at most (last - first)/2
5084 swaps are done; otherwise at most (last - first) swaps are done. Exactly
5085 (last - first) applications of the predicate are done.
5090 <p><b>Rationale:</b></p>
5092 Partition is a "foundation" algorithm useful in many contexts (like sorting
5093 as just one example) - my motivation for extending it to include forward
5094 iterators is slist - without this extension you can't partition an slist
5095 (without writing your own partition). Holes like this in the standard
5096 library weaken the argument for generic programming (ideally I'd be able
5097 to provide a library that would refine std::partition() to other concepts
5098 without fear of conflicting with other libraries doing the same - but
5099 that is a digression). I consider the fact that partition isn't defined
5100 to work for ForwardIterator a minor embarrassment.
5103 <p><i>[Mont Tremblant: Moved to Open, request motivation and use cases
5104 by next meeting. Sean provided further rationale by post-meeting
5114 <h3><a name="502"></a>502. Proposition: Clarification of the interaction between a facet and an iterator</h3>
5115 <p><b>Section:</b> 22.1.1.1.1 [locale.category] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5116 <b>Submitter:</b> Christopher Conrade Zseleghovski <b>Date:</b> 2005-06-07</p>
5117 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.category">issues</a> in [locale.category].</p>
5118 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5119 <p><b>Discussion:</b></p>
5125 This requirement seems obvious to me, it is the essence of code modularity.
5126 I have complained to Mr. Plauger that the Dinkumware library does not
5127 observe this principle but he objected that this behaviour is not covered in
5132 <p><b>Proposed resolution:</b></p>
5134 Append the following point to 22.1.1.1.1:
5138 6. The implementation of a facet of Table 52 parametrized with an
5139 InputIterator/OutputIterator should use that iterator only as character
5140 source/sink respectively.
5141 For a *_get facet, it means that the value received depends only on the
5142 sequence of input characters and not on how they are accessed.
5143 For a *_put facet, it means that the sequence of characters output depends
5144 only on the value to be formatted and not of how the characters are stored.
5148 Berlin: Moved to Open, Need to clean up this area to make it clear
5149 locales don't have to contain open ended sets of facets. Jack, Howard,
5160 <h3><a name="503"></a>503. more on locales</h3>
5161 <p><b>Section:</b> 22.2 [locale.categories] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5162 <b>Submitter:</b> P.J. Plauger <b>Date:</b> 2005-06-20</p>
5163 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#locale.categories">active issues</a> in [locale.categories].</p>
5164 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.categories">issues</a> in [locale.categories].</p>
5165 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5166 <p><b>Discussion:</b></p>
5168 a) In 22.2.1.1 para. 2 we refer to "the instantiations required in Table
5169 51" to refer to the facet *objects* associated with a locale. And we
5170 almost certainly mean just those associated with the default or "C"
5171 locale. Otherwise, you can't switch to a locale that enforces a different
5172 mapping between narrow and wide characters, or that defines additional
5173 uppercase characters.
5177 b) 22.2.1.5 para. 3 (codecvt) has the same issues.
5181 c) 22.2.1.5.2 (do_unshift) is even worse. It *forbids* the generation of
5182 a homing sequence for the basic character set, which might very well need
5187 d) 22.2.1.5.2 (do_length) likewise dictates that the default mapping
5188 between wide and narrow characters be taken as one-for-one.
5192 e) 22.2.2 para. 2 (num_get/put) is both muddled and vacuous, as far as
5193 I can tell. The muddle is, as before, calling Table 51 a list of
5194 instantiations. But the constraint it applies seems to me to cover
5195 *all* defined uses of num_get/put, so why bother to say so?
5199 f) 22.2.3.1.2 para. 1(do_decimal_point) says "The required instantiations
5200 return '.' or L'.'.) Presumably this means "as appropriate for the
5201 character type. But given the vague definition of "required" earlier,
5202 this overrules *any* change of decimal point for non "C" locales.
5203 Surely we don't want to do that.
5207 g) 22.2.3.1.2 para. 2 (do_thousands_sep) says "The required instantiations
5208 return ',' or L','.) As above, this probably means "as appropriate for the
5209 character type. But this overrules the "C" locale, which requires *no*
5210 character ('\0') for the thousands separator. Even if we agree that we
5211 don't mean to block changes in decimal point or thousands separator,
5212 we should also eliminate this clear incompatibility with C.
5216 h) 22.2.3.1.2 para. 2 (do_grouping) says "The required instantiations
5217 return the empty string, indicating no grouping." Same considerations
5218 as for do_decimal_point.
5222 i) 22.2.4.1 para. 1 (collate) refers to "instantiations required in Table
5223 51". Same bad jargon.
5227 j) 22.2.4.1.2 para. 1 (do_compare) refers to "instantiations required
5228 in Table 51". Same bad jargon.
5232 k) 22.2.5 para. 1 (time_get/put) uses the same muddled and vacuous
5237 l) 22.2.6 para. 2 (money_get/put) uses the same muddled and vacuous
5242 m) 22.2.6.3.2 (do_pos/neg_format) says "The instantiations required
5243 in Table 51 ... return an object of type pattern initialized to
5244 {symbol, sign, none, value}." This once again *overrides* the "C"
5245 locale, as well as any other locale."
5249 3) We constrain the use_facet calls that can be made by num_get/put,
5250 so why don't we do the same for money_get/put? Or for any of the
5251 other facets, for that matter?
5255 4) As an almost aside, we spell out when a facet needs to use the ctype
5256 facet, but several also need to use a codecvt facet and we don't say so.
5259 Berlin: Bill to provide wording.
5264 <p><b>Proposed resolution:</b></p>
5273 <h3><a name="522"></a>522. Tuple doesn't define swap</h3>
5274 <p><b>Section:</b> 20.4 [tuple], TR1 6.1 [tr.tuple] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
5275 <b>Submitter:</b> Andy Koenig <b>Date:</b> 2005-07-03</p>
5276 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#tuple">active issues</a> in [tuple].</p>
5277 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple">issues</a> in [tuple].</p>
5278 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
5279 <p><b>Discussion:</b></p>
5281 Tuple doesn't define swap(). It should.
5284 Berlin: Doug to provide wording.
5288 Batavia: Howard to provide wording.
5292 Toronto: Howard to provide wording (really this time).
5297 Bellevue: Alisdair provided wording.
5303 <p><b>Proposed resolution:</b></p>
5306 Add these signatures to 20.4 [tuple]
5309 <blockquote><pre>template <class... Types>
5310 void swap(tuple<Types...>& x, tuple<Types...>& y);
5311 template <class... Types>
5312 void swap(tuple<Types...>&& x, tuple<Types...>& y);
5313 template <class... Types>
5314 void swap(tuple<Types...>& x, tuple<Types...>&& y);
5318 Add this signature to 20.4.1 [tuple.tuple]
5321 <blockquote><pre>void swap(tuple&&);
5325 Add the following two sections to the end of the tuple clauses
5330 20.3.1.7 tuple swap [tuple.swap]
5333 <pre>void swap(tuple&& rhs);
5338 <i>Requires:</i> Each type in <tt>Types</tt> shall be <tt>Swappable</tt>.
5341 <i>Effects:</i> Calls <tt>swap</tt> for each element in <tt>*this</tt> and its corresponding element
5345 <i>Throws:</i> Nothing, unless one of the element-wise <tt>swap</tt> calls throw an
5351 20.3.1.8 tuple specialized algorithms [tuple.special]
5354 <pre>template <class... Types>
5355 void swap(tuple<Types...>& x, tuple<Types...>& y);
5356 template <class... Types>
5357 void swap(tuple<Types...>&& x, tuple<Types...>& y);
5358 template <class... Types>
5359 void swap(tuple<Types...>& x, tuple<Types...>&& y);
5364 <i>Effects:</i> x.swap(y)
5375 <h3><a name="523"></a>523. regex case-insensitive character ranges are unimplementable as specified</h3>
5376 <p><b>Section:</b> 28 [re] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5377 <b>Submitter:</b> Eric Niebler <b>Date:</b> 2005-07-01</p>
5378 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#re">issues</a> in [re].</p>
5379 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5380 <p><b>Discussion:</b></p>
5382 A problem with TR1 regex is currently being discussed on the Boost
5383 developers list. It involves the handling of case-insensitive matching
5384 of character ranges such as [Z-a]. The proper behavior (according to the
5385 ECMAScript standard) is unimplementable given the current specification
5386 of the TR1 regex_traits<> class template. John Maddock, the author of
5387 the TR1 regex proposal, agrees there is a problem. The full discussion
5388 can be found at http://lists.boost.org/boost/2005/06/28850.php (first
5389 message copied below). We don't have any recommendations as yet.
5392 -- Begin original message --
5395 The situation of interest is described in the ECMAScript specification
5396 (ECMA-262), section 15.10.2.15:
5399 "Even if the pattern ignores case, the case of the two ends of a range
5400 is significant in determining which characters belong to the range.
5401 Thus, for example, the pattern /[E-F]/i matches only the letters E, F,
5402 e, and f, while the pattern /[E-f]/i matches all upper and lower-case
5403 ASCII letters as well as the symbols [, \, ], ^, _, and `."
5406 A more interesting case is what should happen when doing a
5407 case-insentitive match on a range such as [Z-a]. It should match z, Z,
5408 a, A and the symbols [, \, ], ^, _, and `. This is not what happens with
5409 Boost.Regex (it throws an exception from the regex constructor).
5412 The tough pill to swallow is that, given the specification in TR1, I
5413 don't think there is any effective way to handle this situation.
5414 According to the spec, case-insensitivity is handled with
5415 regex_traits<>::translate_nocase(CharT) -- two characters are equivalent
5416 if they compare equal after both are sent through the translate_nocase
5417 function. But I don't see any way of using this translation function to
5418 make character ranges case-insensitive. Consider the difficulty of
5419 detecting whether "z" is in the range [Z-a]. Applying the transformation
5420 to "z" has no effect (it is essentially std::tolower). And we're not
5421 allowed to apply the transformation to the ends of the range, because as
5422 ECMA-262 says, "the case of the two ends of a range is significant."
5425 So AFAICT, TR1 regex is just broken, as is Boost.Regex. One possible fix
5426 is to redefine translate_nocase to return a string_type containing all
5427 the characters that should compare equal to the specified character. But
5428 this function is hard to implement for Unicode, and it doesn't play nice
5429 with the existing ctype facet. What a mess!
5432 -- End original message --
5441 One small correction, I have since found that ICU's regex package does
5442 implement this correctly, using a similar mechanism to the current
5446 Given an expression [c1-c2] that is compiled as case insensitive it:
5449 Enumerates every character in the range c1 to c2 and converts it to it's
5450 case folded equivalent. That case folded character is then used a key to a
5451 table of equivalence classes, and each member of the class is added to the
5452 list of possible matches supported by the character-class. This second step
5453 isn't possible with our current traits class design, but isn't necessary if
5454 the input text is also converted to a case-folded equivalent on the fly.
5457 ICU applies similar brute force mechanisms to character classes such as
5458 [[:lower:]] and [[:word:]], however these are at least cached, so the impact
5459 is less noticeable in this case.
5462 Quick and dirty performance comparisons show that expressions such as
5463 "[X-\\x{fff0}]+" are indeed very slow to compile with ICU (about 200 times
5464 slower than a "normal" expression). For an application that uses a lot of
5465 regexes this could have a noticeable performance impact. ICU also has an
5466 advantage in that it knows the range of valid characters codes: code points
5467 outside that range are assumed not to require enumeration, as they can not
5468 be part of any equivalence class. I presume that if we want the TR1.Regex
5469 to work with arbitrarily large character sets enumeration really does become
5473 Finally note that Unicode has:
5476 Three cases (upper, lower and title).
5477 One to many, and many to one case transformations.
5478 Character that have context sensitive case translations - for example an
5479 uppercase sigma has two different lowercase forms - the form chosen depends
5480 on context(is it end of a word or not), a caseless match for an upper case
5481 sigma should match either of the lower case forms, which is why case folding
5482 is often approximated by tolower(toupper(c)).
5485 Probably we need some way to enumerate character equivalence classes,
5486 including digraphs (either as a result or an input), and some way to tell
5487 whether the next character pair is a valid digraph in the current locale.
5490 Hoping this doesn't make this even more complex that it was already,
5494 Portland: Alisdair: Detect as invalid, throw an exception.
5495 Pete: Possible general problem with case insensitive ranges.
5501 <p><b>Proposed resolution:</b></p>
5508 <h3><a name="539"></a>539. partial_sum and adjacent_difference should mention requirements</h3>
5509 <p><b>Section:</b> 26.6.3 [partial.sum] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5510 <b>Submitter:</b> Marc Schoolderman <b>Date:</b> 2006-02-06</p>
5511 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5512 <p><b>Discussion:</b></p>
5514 There are some problems in the definition of partial_sum and
5515 adjacent_difference in 26.4 [lib.numeric.ops]
5519 Unlike <tt>accumulate</tt> and <tt>inner_product</tt>, these functions are not
5520 parametrized on a "type T", instead, 26.4.3 [lib.partial.sum] simply
5521 specifies the effects clause as;
5525 Assigns to every element referred to by iterator <tt>i</tt> in the range
5526 <tt>[result,result + (last - first))</tt> a value correspondingly equal to
5528 <blockquote><pre>((...(* first + *( first + 1)) + ...) + *( first + ( i - result )))
5533 And similarly for BinaryOperation. Using just this definition, it seems
5534 logical to expect that:
5538 <blockquote><pre>char i_array[4] = { 100, 100, 100, 100 };
5541 std::partial_sum(i_array, i_array+4, o_array);
5548 <blockquote><pre>int o_array[4] = { 100, 100+100, 100+100+100, 100+100+100+100 };
5552 i.e. 100, 200, 300, 400, with addition happening in the <tt>result type</tt>,
5557 Yet all implementations I have tested produce 100, -56, 44, -112,
5558 because they are using an accumulator of the <tt>InputIterator</tt>'s
5559 <tt>value_type</tt>, which in this case is <tt>char</tt>, not <tt>int</tt>.
5563 The issue becomes more noticeable when the result of the expression <tt>*i +
5564 *(i+1)</tt> or <tt>binary_op(*i, *i-1)</tt> can't be converted to the
5565 <tt>value_type</tt>. In a contrived example:
5568 <blockquote><pre>enum not_int { x = 1, y = 2 };
5570 not_int e_array[4] = { x, x, y, y };
5571 std::partial_sum(e_array, e_array+4, o_array);
5575 Is it the intent that the operations happen in the <tt>input type</tt>, or in
5576 the <tt>result type</tt>?
5580 If the intent is that operations happen in the <tt>result type</tt>, something
5581 like this should be added to the "Requires" clause of 26.4.3/4
5586 The type of <tt>*i + *(i+1)</tt> or <tt>binary_op(*i, *(i+1))</tt> shall meet the
5587 requirements of <tt>CopyConstructible</tt> (20.1.3) and <tt>Assignable</tt>
5592 (As also required for <tt>T</tt> in 26.4.1 [lib.accumulate] and 26.4.2
5593 [lib.inner.product].)
5597 The "auto initializer" feature proposed in
5598 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1894.pdf">N1894</a>
5600 implement <tt>partial_sum</tt> this way. The 'narrowing' behaviour can still be
5601 obtained by using the <tt>std::plus<></tt> function object.
5605 If the intent is that operations happen in the <tt>input type</tt>, then
5606 something like this should be added instead;
5610 The type of *first shall meet the requirements of
5611 <tt>CopyConstructible</tt> (20.1.3) and <tt>Assignable</tt> (23.1) types.
5612 The result of <tt>*i + *(i+1)</tt> or <tt>binary_op(*i, *(i+1))</tt> shall be
5613 convertible to this type.
5617 The 'widening' behaviour can then be obtained by writing a custom proxy
5618 iterator, which is somewhat involved.
5622 In both cases, the semantics should probably be clarified.
5626 26.4.4 [lib.adjacent.difference] is similarly underspecified, although
5627 all implementations seem to perform operations in the 'result' type:
5630 <blockquote><pre>unsigned char i_array[4] = { 4, 3, 2, 1 };
5633 std::adjacent_difference(i_array, i_array+4, o_array);
5637 o_array is 4, -1, -1, -1 as expected, not 4, 255, 255, 255.
5641 In any case, <tt>adjacent_difference</tt> doesn't mention the requirements on the
5642 <tt>value_type</tt>; it can be brought in line with the rest of 26.4
5643 [lib.numeric.ops] by adding the following to 26.4.4/2
5644 [lib.adjacent.difference]:
5648 The type of <tt>*first</tt> shall meet the requirements of
5649 <tt>CopyConstructible</tt> (20.1.3) and <tt>Assignable</tt> (23.1) types."
5652 Berlin: Giving output iterator's value_types very controversial. Suggestion of
5653 adding signatures to allow user to specify "accumulator".
5663 The intent of the algorithms is to perform their calculations using the type of the input iterator.
5664 Proposed wording provided.
5673 We did not agree that the proposed resolution was correct. For example,
5674 when the arguments are types <tt>(float*, float*, double*)</tt>, the
5675 highest-quality solution would use double as the type of the
5676 accumulator. If the intent of the wording is to require that the type of
5677 the accumulator must be the <tt>input_iterator</tt>'s <tt>value_type</tt>, the wording
5683 <p><b>Proposed resolution:</b></p>
5685 Add to section 26.6.3 [partial.sum] paragraph 4 the following two sentences:
5689 The type of <tt>*first</tt> shall meet the requirements of <tt>CopyConstructible</tt>?
5690 (20.1.3?) and <tt>Assignable</tt> (23.1?) types. The result of <tt>*i + *(i+1)</tt> or
5691 <tt>binary_op(*i, *(i+1))</tt> shall be convertible to this type.
5695 Add to section 26.6.4 [adjacent.difference] paragraph 2 the following sentence:
5699 The type of <tt>*first</tt> shall meet the requirements of <tt>CopyConstructible</tt>?
5700 (20.1.3) and <tt>Assignable</tt> (23.1) types.
5709 <h3><a name="546"></a>546. _Longlong and _ULonglong are integer types</h3>
5710 <p><b>Section:</b> TR1 5.1.1 [tr.rand.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5711 <b>Submitter:</b> Matt Austern <b>Date:</b> 2006-01-10</p>
5712 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5713 <p><b>Discussion:</b></p>
5715 The TR sneaks in two new integer types, _Longlong and _Ulonglong, in [tr.c99].
5716 The rest of the TR should use that type. I believe this affects two places.
5717 First, the random number requirements, 5.1.1/10-11, lists all of the types with
5718 which template parameters named IntType and UIntType may be instantiated.
5719 _Longlong (or "long long", assuming it is added to C++0x) should be added to the
5720 IntType list, and UIntType (again, or "unsigned long long") should be added to
5721 the UIntType list. Second, 6.3.2 lists the types for which hash<> is
5722 required to be instantiable. _Longlong and _Ulonglong should be added to that
5723 list, so that people may use long long as a hash key.
5727 <p><b>Proposed resolution:</b></p>
5736 <h3><a name="556"></a>556. is Compare a BinaryPredicate?</h3>
5737 <p><b>Section:</b> 25.3 [alg.sorting] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5738 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2006-02-05</p>
5739 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#alg.sorting">issues</a> in [alg.sorting].</p>
5740 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5741 <p><b>Discussion:</b></p>
5743 In 25, p8 we allow BinaryPredicates to return a type that's convertible
5744 to bool but need not actually be bool. That allows predicates to return
5745 things like proxies and requires that implementations be careful about
5746 what kinds of expressions they use the result of the predicate in (e.g.,
5747 the expression in if (!pred(a, b)) need not be well-formed since the
5748 negation operator may be inaccessible or return a type that's not
5749 convertible to bool).
5752 Here's the text for reference:
5755 ...if an algorithm takes BinaryPredicate binary_pred as its argument
5756 and first1 and first2 as its iterator arguments, it should work
5757 correctly in the construct if (binary_pred(*first1, first2)){...}.
5761 In 25.3, p2 we require that the Compare function object return true
5762 of false, which would seem to preclude such proxies. The relevant text
5766 Compare is used as a function object which returns true if the first
5767 argument is less than the second, and false otherwise...
5771 <p><b>Proposed resolution:</b></p>
5773 I think we could fix this by rewording 25.3, p2 to read somthing like:
5776 -2- <tt>Compare</tt> is <del>used as a function object which returns
5777 <tt>true</tt> if the first argument</del> <ins>a <tt>BinaryPredicate</tt>. The
5778 return value of the function call operator applied to an object of type
5779 <tt>Compare</tt>, when converted to type <tt>bool</tt>, yields <tt>true</tt>
5780 if the first argument of the call</ins> is less than the second, and
5781 <tt>false</tt> otherwise. <tt>Compare <i>comp</i></tt> is used throughout for
5782 algorithms assuming an ordering relation. It is assumed that <tt><i>comp</i></tt>
5783 will not apply any non-constant function through the dereferenced iterator.
5788 Portland: Jack to define "convertible to bool" such that short circuiting isn't
5797 <h3><a name="564"></a>564. stringbuf seekpos underspecified</h3>
5798 <p><b>Section:</b> 27.7.1.4 [stringbuf.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5799 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2006-02-23</p>
5800 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#stringbuf.virtuals">issues</a> in [stringbuf.virtuals].</p>
5801 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5802 <p><b>Discussion:</b></p>
5804 The effects of the <code>seekpos()</code> member function of
5805 <code>basic_stringbuf</code> simply say that the function positions
5806 the input and/or output sequences but fail to spell out exactly
5807 how. This is in contrast to the detail in which <code>seekoff()</code>
5812 <p><b>Proposed resolution:</b></p>
5815 Change 27.7.1.3, p13 to read:
5820 -13- <i>Effects:</i> <ins>Same as <tt>seekoff(off_type(<i>sp</i>), ios_base::beg,
5821 <i>which</i>)</tt>.</ins> <del>Alters the stream position within the controlled sequences,
5822 if possible, to correspond to the stream position stored in <tt><i>sp</i></tt>
5823 (as described below).</del>
5826 <li><del>If <tt>(<i>which</i> & ios_base::in) != 0</tt>, positions the input sequence.</del></li>
5827 <li><del>If <tt>(<i>which</i> & ios_base::out) != 0</tt>, positions the output sequence.</del></li>
5828 <li><del>If <tt><i>sp</i></tt> is an invalid stream position, or if the function
5829 positions neither sequence, the positioning operation fails. If <tt><i>sp</i></tt>
5830 has not been obtained by a previous successful call to one of the positioning
5831 functions (<tt>seekoff</tt>, <tt>seekpos</tt>, <tt>tellg</tt>, <tt>tellp</tt>)
5832 the effect is undefined.</del></li>
5838 Kona (2007): A <tt>pos_type</tt> is a position in a stream by
5839 definition, so there is no ambiguity as to what it means. Proposed
5845 Post-Kona Martin adds:
5846 I'm afraid I disagree
5847 with the Kona '07 rationale for marking it NAD. The only text
5848 that describes precisely what it means to position the input
5849 or output sequence is in <tt>seekoff()</tt>. The <tt>seekpos()</tt> Effects
5850 clause is inadequate in comparison and the proposed resolution
5851 plugs the hole by specifying <tt>seekpos()</tt> in terms of <tt>seekoff()</tt>.
5859 <h3><a name="565"></a>565. xsputn inefficient</h3>
5860 <p><b>Section:</b> 27.5.2.4.5 [streambuf.virt.put] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5861 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2006-02-23</p>
5862 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5863 <p><b>Discussion:</b></p>
5866 <tt>streambuf::xsputn()</tt> is specified to have the effect of
5867 "writing up to <tt>n</tt> characters to the output sequence as if by
5868 repeated calls to <tt>sputc(c)</tt>."
5873 Since <tt>sputc()</tt> is required to call <tt>overflow()</tt> when
5874 <tt>(pptr() == epptr())</tt> is true, strictly speaking
5875 <tt>xsputn()</tt> should do the same. However, doing so would be
5876 suboptimal in some interesting cases, such as in unbuffered mode or
5877 when the buffer is <tt>basic_stringbuf</tt>.
5882 Assuming calling <tt>overflow()</tt> is not really intended to be
5883 required and the wording is simply meant to describe the general
5884 effect of appending to the end of the sequence it would be worthwhile
5885 to mention in <tt>xsputn()</tt> that the function is not actually
5886 required to cause a call to <tt>overflow()</tt>.
5891 <p><b>Proposed resolution:</b></p>
5894 Add the following sentence to the <tt>xsputn()</tt> Effects clause in
5895 27.5.2.4.5, p1 (N1804):
5900 -1- <i>Effects:</i> Writes up to <tt><i>n</i></tt> characters to the output
5901 sequence as if by repeated calls to <tt>sputc(<i>c</i>)</tt>. The characters
5902 written are obtained from successive elements of the array whose first element
5903 is designated by <tt><i>s</i></tt>. Writing stops when either <tt><i>n</i></tt>
5904 characters have been written or a call to <tt>sputc(<i>c</i>)</tt> would return
5905 <tt>traits::eof()</tt>. <ins>It is uspecified whether the function calls
5906 <tt>overflow()</tt> when <tt>(pptr() == epptr())</tt> becomes true or whether
5907 it achieves the same effects by other means.</ins>
5912 In addition, I suggest to add a footnote to this function with the
5913 same text as Footnote 292 to make it extra clear that derived classes
5914 are permitted to override <tt>xsputn()</tt> for efficiency.
5920 Kona (2007): We want to permit a <tt>streambuf</tt> that streams output directly
5921 to a device without making calls to <tt>sputc</tt> or <tt>overflow</tt>. We believe that
5922 has always been the intention of the committee. We believe that the
5923 proposed wording doesn't accomplish that. Proposed Disposition: Open
5931 <h3><a name="568"></a>568. log2 overloads missing</h3>
5932 <p><b>Section:</b> TR1 8.16.4 [tr.c99.cmath.over] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
5933 <b>Submitter:</b> Paolo Carlini <b>Date:</b> 2006-03-07</p>
5934 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
5935 <p><b>Discussion:</b></p>
5937 <tt>log2</tt> is missing from the list of "additional overloads" in TR1 8.16.4 [tr.c99.cmath.over] p1.
5941 Hinnant: This is a TR1 issue only. It is fixed in the current (N2135) WD.
5945 <p><b>Proposed resolution:</b></p>
5947 Add <tt>log2</tt> to the list of functions in TR1 8.16.4 [tr.c99.cmath.over] p1.
5955 <h3><a name="573"></a>573. C++0x file positioning should handle modern file sizes</h3>
5956 <p><b>Section:</b> 27.4.3 [fpos] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5957 <b>Submitter:</b> Beman Dawes <b>Date:</b> 2006-04-12</p>
5958 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#fpos">issues</a> in [fpos].</p>
5959 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
5960 <p><b>Discussion:</b></p>
5962 There are two deficiencies related to file sizes:
5965 <li>It doesn't appear that the Standard Library is specified in
5966 a way that handles modern file sizes, which are often too
5967 large to be represented by an unsigned long.</li>
5969 <li>The std::fpos class does not currently have the ability to
5970 set/get file positions.</li>
5973 The Dinkumware implementation of the Standard Library as shipped with the Microsoft compiler copes with these issues by:
5976 <li>Defining fpos_t be long long, which is large enough to
5977 represent any file position likely in the foreseeable future.</li>
5979 <li>Adding member functions to class fpos. For example,
5980 <blockquote><pre>fpos_t seekpos() const;
5985 Because there are so many types relating to file positions and offsets (fpos_t,
5986 fpos, pos_type, off_type, streamoff, streamsize, streampos, wstreampos, and
5987 perhaps more), it is difficult to know if the Dinkumware extensions are
5988 sufficient. But they seem a useful starting place for discussions, and they do
5989 represent existing practice.
5993 Kona (2007): We need a paper. It would be nice if someone proposed
5994 clarifications to the definitions of <tt>pos_type</tt> and <tt>off_type</tt>. Currently
5995 these definitions are horrible. Proposed Disposition: Open
6000 <p><b>Proposed resolution:</b></p>
6009 <h3><a name="580"></a>580. unused allocator members</h3>
6010 <p><b>Section:</b> 20.1.2 [allocator.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6011 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2006-06-14</p>
6012 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#allocator.requirements">active issues</a> in [allocator.requirements].</p>
6013 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#allocator.requirements">issues</a> in [allocator.requirements].</p>
6014 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6015 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#479">479</a></p>
6016 <p><b>Discussion:</b></p>
6019 C++ Standard Library templates that take an allocator as an argument
6020 are required to call the <code>allocate()</code> and
6021 <code>deallocate()</code> members of the allocator object to obtain
6022 storage. However, they do not appear to be required to call any other
6023 allocator members such as <code>construct()</code>,
6024 <code>destroy()</code>, <code>address()</code>, and
6025 <code>max_size()</code>. This makes these allocator members less than
6026 useful in portable programs.
6031 It's unclear to me whether the absence of the requirement to use these
6032 allocator members is an unintentional omission or a deliberate
6033 choice. However, since the functions exist in the standard allocator
6034 and since they are required to be provided by any user-defined
6035 allocator I believe the standard ought to be clarified to explictly
6036 specify whether programs should or should not be able to rely on
6037 standard containers calling the functions.
6042 I propose that all containers be required to make use of these
6047 Batavia: We support this resolution. Martin to provide wording.
6051 pre-Oxford: Martin provided wording.
6056 <p><b>Proposed resolution:</b></p>
6059 Specifically, I propose to change 23.1 [container.requirements],
6065 -9- Copy constructors for all container types defined in this clause
6066 <ins>that are parametrized on <code>Allocator</code></ins> copy
6067 <del>an</del><ins>the</ins> allocator argument from their respective
6070 All other constructors for these container types take a<del>n</del>
6071 <ins>const</ins> <code>Allocator&</code> argument (20.1.6), an
6072 allocator whose <code>value_type</code> is the same as the container's
6073 <code>value_type</code>.
6075 A copy of this argument <del>is</del><ins>shall be</ins> used for any
6076 memory allocation <ins> and deallocation</ins> performed<del>,</del>
6077 by these constructors and by all member functions<del>,</del> during
6078 the lifetime of each container object. <ins>Allocation shall be
6079 performed "as if" by calling the <code>allocate()</code> member
6080 function on a copy of the allocator object of the appropriate type
6081 <sup>New Footnote)</sup>, and deallocation "as if" by calling
6082 <code>deallocate()</code> on a copy of the same allocator object of
6083 the corresponding type.</ins>
6085 <ins>A copy of this argument shall also be used to construct and
6086 destroy objects whose lifetime is managed by the container, including
6087 but not limited to those of the container's <code>value_type</code>,
6088 and to obtain their address. All objects residing in storage
6089 allocated by a container's allocator shall be constructed "as if" by
6090 calling the <code>construct()</code> member function on a copy of the
6091 allocator object of the appropriate type. The same objects shall be
6092 destroyed "as if" by calling <code>destroy()</code> on a copy of the
6093 same allocator object of the same type. The address of such objects
6094 shall be obtained "as if" by calling the <code>address()</code> member
6095 function on a copy of the allocator object of the appropriate
6098 <ins>Finally, a copy of this argument shall be used by its container
6099 object to determine the maximum number of objects of the container's
6100 <code>value_type</code> the container may store at the same time. The
6101 container member function <code>max_size()</code> obtains this number
6102 from the value returned by a call to
6103 <code>get_allocator().max_size()</code>.</ins>
6105 In all container types defined in this clause <ins>that are
6106 parametrized on <code>Allocator</code></ins>, the member
6107 <code>get_allocator()</code> returns a copy of the
6108 <code>Allocator</code> object used to construct the
6109 container.<sup>258)</sup>
6112 New Footnote: This type may be different from <code>Allocator</code>:
6113 it may be derived from <code>Allocator</code> via
6114 <code>Allocator::rebind<U>::other</code> for the appropriate
6115 type <code>U</code>.
6120 The proposed wording seems cumbersome but I couldn't think of a better
6121 way to describe the requirement that containers use their
6122 <code>Allocator</code> to manage only objects (regardless of their
6123 type) that persist over their lifetimes and not, for example,
6124 temporaries created on the stack. That is, containers shouldn't be
6125 required to call <code>Allocator::construct(Allocator::allocate(1),
6126 elem)</code> just to construct a temporary copy of an element, or
6127 <code>Allocator::destroy(Allocator::address(temp), 1)</code> to
6128 destroy temporaries.
6134 Howard: This same paragraph will need some work to accommodate <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#431">431</a>.
6139 post Oxford: This would be rendered NAD Editorial by acceptance of
6140 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2257.html">N2257</a>.
6148 <h3><a name="582"></a>582. specialized algorithms and volatile storage</h3>
6149 <p><b>Section:</b> 20.7.10.1 [uninitialized.copy] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6150 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2006-06-14</p>
6151 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#uninitialized.copy">issues</a> in [uninitialized.copy].</p>
6152 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6153 <p><b>Discussion:</b></p>
6156 The specialized algorithms [lib.specialized.algorithms] are specified
6157 as having the general effect of invoking the following expression:
6161 new (static_cast<void*>(&*i))
6162 typename iterator_traits<ForwardIterator>::value_type (x)
6167 This expression is ill-formed when the type of the subexpression
6168 <code>&*i</code> is some volatile-qualified <code>T</code>.
6173 Batavia: Lack of support for proposed resolution but agree there is a
6174 defect. Howard to look at wording. Concern that move semantics
6175 properly expressed if iterator returns rvalue.
6181 <p><b>Proposed resolution:</b></p>
6184 In order to allow these algorithms to operate on volatile storage I
6185 propose to change the expression so as to make it well-formed even for
6186 pointers to volatile types. Specifically, I propose the following
6187 changes to clauses 20 and 24. Change 20.6.4.1, p1 to read:
6193 typedef typename iterator_traits<ForwardIterator>::pointer pointer;
6194 typedef typename iterator_traits<ForwardIterator>::value_type value_type;
6196 for (; first != last; ++result, ++first)
6197 new (static_cast<void*>(const_cast<pointer>(&*result))
6198 value_type (*first);
6203 change 20.6.4.2, p1 to read
6209 typedef typename iterator_traits<ForwardIterator>::pointer pointer;
6210 typedef typename iterator_traits<ForwardIterator>::value_type value_type;
6212 for (; first != last; ++result, ++first)
6213 new (static_cast<void*>(const_cast<pointer>(&*first))
6219 and change 20.6.4.3, p1 to read
6225 typedef typename iterator_traits<ForwardIterator>::pointer pointer;
6226 typedef typename iterator_traits<ForwardIterator>::value_type value_type;
6228 for (; n--; ++first)
6229 new (static_cast<void*>(const_cast<pointer>(&*first))
6235 In addition, since there is no partial specialization for
6236 <code>iterator_traits<volatile T*></code> I propose to add one
6237 to parallel such specialization for <const T*>. Specifically, I
6238 propose to add the following text to the end of 24.3.1, p3:
6243 and for pointers to volatile as
6248 template<class T> struct iterator_traits<volatile T*> {
6249 typedef ptrdiff_t difference_type;
6250 typedef T value_type;
6251 typedef volatile T* pointer;
6252 typedef volatile T& reference;
6253 typedef random_access_iterator_tag iterator_category;
6260 Note that the change to <code>iterator_traits</code> isn't necessary
6261 in order to implement the specialized algorithms in a way that allows
6262 them to operate on volatile strorage. It is only necesassary in order
6263 to specify their effects in terms of <code>iterator_traits</code> as
6264 is done here. Implementations can (and some do) achieve the same
6265 effect by means of function template overloading.
6273 <h3><a name="585"></a>585. facet error reporting</h3>
6274 <p><b>Section:</b> 22.2 [locale.categories] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6275 <b>Submitter:</b> Martin Sebor, Paolo Carlini <b>Date:</b> 2006-06-22</p>
6276 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#locale.categories">active issues</a> in [locale.categories].</p>
6277 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.categories">issues</a> in [locale.categories].</p>
6278 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6279 <p><b>Discussion:</b></p>
6282 Section 22.2, paragraph 2 requires facet <code>get()</code> members
6283 that take an <code>ios_base::iostate&</code> argument,
6284 <code><i>err</i></code>, to ignore the (initial) value of the
6285 argument, but to set it to <code>ios_base::failbit</code> in case of a
6291 We believe there are a few minor problems with this blanket
6292 requirement in conjunction with the wording specific to each
6293 <code>get()</code> member function.
6298 First, besides <code>get()</code> there are other member functions
6299 with a slightly different name (for example,
6300 <code>get_date()</code>). It's not completely clear that the intent of
6301 the paragraph is to include those as well, and at least one
6302 implementation has interpreted the requirement literally.
6307 Second, the requirement to "set the argument to
6308 <code>ios_base::failbit</code> suggests that the functions are not
6309 permitted to set it to any other value (such as
6310 <code>ios_base::eofbit</code>, or even <code>ios_base::eofbit |
6311 ios_base::failbit</code>).
6316 However, 22.2.2.1.2, p5 (Stage 3 of <code>num_get</code> parsing) and
6317 p6 (<code>bool</code> parsing) specifies that the <code>do_get</code>
6318 functions perform <code><i>err</i> |= ios_base::eofbit</code>, which
6319 contradicts the earlier requirement to ignore <i>err</i>'s initial
6325 22.2.6.1.2, p1 (the Effects clause of the <code>money_get</code>
6326 facet's <code>do_get</code> member functions) also specifies that
6327 <code><i>err</i></code>'s initial value be used to compute the final
6328 value by ORing it with either <code>ios_base::failbit</code> or
6329 with<code>ios_base::eofbit | ios_base::failbit</code>.
6334 <p><b>Proposed resolution:</b></p>
6337 We believe the intent is for all facet member functions that take an
6338 <code>ios_base::iostate&</code> argument to:
6344 ignore the initial value of the <code><i>err</i></code> argument,
6349 reset <code><i>err</i></code> to <code>ios_base::goodbit</code> prior
6350 to any further processing,
6355 and set either <code>ios_base::eofbit</code>, or
6356 <code>ios_base::failbit</code>, or both in <code><i>err</i></code>, as
6357 appropriate, in response to reaching the end-of-file or on parse
6364 To that effect we propose to change 22.2, p2 as follows:
6369 The <i>put</i><del>()</del> members make no provision for error
6370 reporting. (Any failures of the OutputIterator argument must be
6371 extracted from the returned iterator.) <ins>Unless otherwise
6372 specified, </ins>the <i>get</i><del>()</del> members <ins>that</ins>
6373 take an <code>ios_base::iostate&</code> argument <del>whose value
6374 they ignore, but set to ios_base::failbit in case of a parse
6375 error.</del><ins>, <code><i>err</i></code>, start by evaluating
6376 <code>err = ios_base::goodbit</code>, and may subsequently set
6377 <i>err</i> to either <code>ios_base::eofbit</code>, or
6378 <code>ios_base::failbit</code>, or <code>ios_base::eofbit |
6379 ios_base::failbit</code> in response to reaching the end-of-file or in
6380 case of a parse error, or both, respectively.</ins>
6386 Kona (2007): We need to change the proposed wording to clarify that the
6387 phrase "the get members" actually denotes <tt>get()</tt>, <tt>get_date()</tt>, etc.
6388 Proposed Disposition: Open
6395 <h3><a name="588"></a>588. requirements on zero sized tr1::arrays and other details</h3>
6396 <p><b>Section:</b> 23.2.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6397 <b>Submitter:</b> Gennaro Prota <b>Date:</b> 2006-07-18</p>
6398 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#array">active issues</a> in [array].</p>
6399 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#array">issues</a> in [array].</p>
6400 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6401 <p><b>Discussion:</b></p>
6403 The wording used for section 23.2.1 [lib.array] seems to be subtly
6404 ambiguous about zero sized arrays (N==0). Specifically:
6407 * "An instance of array<T, N> stores N elements of type T, so that
6411 Does this imply that a zero sized array object stores 0 elements, i.e.
6412 that it cannot store any element of type T? The next point clarifies
6413 the rationale behind this question, basically how to implement begin()
6417 * 23.2.1.5 [lib.array.zero], p2: "In the case that N == 0, begin() ==
6418 end() == unique value."
6421 What does "unique" mean in this context? Let's consider the following
6422 possible implementations, all relying on a partial specialization:
6425 template< typename T >
6426 class array< T, 0 > {
6431 { return iterator( reinterpret_cast< T * >( this ) ); }
6437 This has been used in boost, probably intending that the return value
6438 had to be unique to the specific array object and that array couldn't
6439 store any T. Note that, besides relying on a reinterpret_cast, has
6440 (more than potential) alignment problems.
6443 template< typename T >
6444 class array< T, 0 > {
6449 { return iterator( &t ); }
6455 This provides a value which is unique to the object and to the type of
6456 the array, but requires storing a T. Also, it would allow the user to
6457 mistakenly provide an initializer list with one element.
6460 A slight variant could be returning *the* null pointer of type T
6462 <blockquote><pre> return static_cast<T*>(0);
6465 In this case the value would be unique to the type array<T, 0> but not
6466 to the objects (all objects of type array<T, 0> with the same value
6467 for T would yield the same pointer value).
6470 Furthermore this is inconsistent with what the standard requires from
6471 allocation functions (see library issue 9).
6474 c) same as above but with t being a static data member; again, the
6475 value would be unique to the type, not to the object.
6478 d) to avoid storing a T *directly* while disallowing the possibility
6479 to use a one-element initializer list a non-aggregate nested class
6482 <blockquote><pre> struct holder { holder() {} T t; } h;
6485 and then begin be defined as
6487 <blockquote><pre> iterator begin() { return &h.t; }
6490 But then, it's arguable whether the array stores a T or not.
6494 -----------------------------------------------------
6497 Now, on different issues:
6500 * what's the effect of calling assign(T&) on a zero-sized array? There
6501 seems to be only mention of front() and back(), in 23.2.1 [lib.array]
6502 p4 (I would also suggest to move that bullet to section 23.2.1.5
6503 [lib.array.zero], for locality of reference)
6506 * (minor) the opening paragraph of 23.2.1 [lib.array] wording is a bit
6507 inconsistent with that of other sequences: that's not a problem in
6508 itself, but compare it for instance with "A vector is a kind of
6509 sequence that supports random access iterators"; though the intent is
6510 obvious one might argue that the wording used for arrays doesn't tell
6511 what an array is, and relies on the reader to infer that it is what
6512 the <array> header defines.
6515 * it would be desiderable to have a static const data member of type
6516 std::size_t, with value N, for usage as integral constant expression
6519 * section 23.1 [lib.container.requirements] seem not to consider
6520 fixed-size containers at all, as it says: "[containers] control
6521 allocation and deallocation of these objects [the contained objects]
6522 through constructors, destructors, *insert and erase* operations"
6525 * max_size() isn't specified: the result is obvious but, technically,
6526 it relies on table 80: "size() of the largest possible container"
6527 which, again, doesn't seem to consider fixed size containers
6531 <p><b>Proposed resolution:</b></p>
6537 Kona (2007): requirements on zero sized <tt>tr1::array</tt>s and other details
6538 Issue 617: <tt>std::array</tt> is a sequence that doesn't satisfy the sequence
6539 requirements? Alisdair will prepare a paper. Proposed Disposition: Open
6547 <h3><a name="597"></a>597. Decimal: The notion of 'promotion' cannot be emulated by user-defined types.</h3>
6548 <p><b>Section:</b> TRDecimal 3.2 [trdec.types.types] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6549 <b>Submitter:</b> Daveed Vandevoorde <b>Date:</b> 2006-04-05</p>
6550 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#trdec.types.types">active issues</a> in [trdec.types.types].</p>
6551 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#trdec.types.types">issues</a> in [trdec.types.types].</p>
6552 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6553 <p><b>Discussion:</b></p>
6555 In a private email, Daveed writes:
6559 I am not familiar with the C TR, but my guess is that the
6560 class type approach still won't match a built-in type
6561 approach because the notion of "promotion" cannot be
6562 emulated by user-defined types.
6570 S(_Decimal32 const&); // Converting constructor
6576 void g(_Decimal32 d) {
6583 If _Decimal32 is a built-in type, the call f(d) will likely
6584 resolve to f(_Decimal64) because that requires only a
6585 promotion, whereas f(S) requires a user-defined conversion.
6588 If _Decimal32 is a class type, I think the call f(d) will be
6589 ambiguous because both the conversion to _Decimal64 and the
6590 conversion to S will be user-defined conversions with neither
6591 better than the other.
6598 In general, a library of arithmetic types cannot exactly emulate the
6599 behavior of the intrinsic numeric types. There are several ways to tell
6600 whether an implementation of the decimal types uses compiler
6601 intrinisics or a library. For example:
6603 <pre> _Decimal32 d1;
6604 d1.operator+=(5); // If d1 is a builtin type, this won't compile.
6607 In preparing the decimal TR, we have three options:
6610 <li>require that the decimal types be class types</li>
6611 <li>require that the decimal types be builtin types, like float and double</li>
6612 <li>specify a library of class types, but allow enough implementor
6613 latitude that a conforming implementation could instead provide builtin
6617 We decided as a group to pursue option #3, but that approach implies
6618 that implementations may not agree on the semantics of certain use
6619 cases (first example, above), or on whether certain other cases are
6620 well-formed (second example). Another potentially important problem is
6621 that, under the present definition of POD, the decimal classes are not
6622 POD types, but builtins will be.
6624 <p>Note that neither example above implies any problems with respect to
6625 C-to-C++ compatibility, since neither example can be expressed in C.
6629 <p><b>Proposed resolution:</b></p>
6636 <h3><a name="606"></a>606. Decimal: allow narrowing conversions</h3>
6637 <p><b>Section:</b> TRDecimal 3.2 [trdec.types.types] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6638 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2006-06-15</p>
6639 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#trdec.types.types">active issues</a> in [trdec.types.types].</p>
6640 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#trdec.types.types">issues</a> in [trdec.types.types].</p>
6641 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6642 <p><b>Discussion:</b></p>
6644 In c++std-lib-17205, Martin writes:
6646 <blockquote><p>...was it a deliberate design choice to make narrowing
6647 assignments ill-formed while permitting narrowing compound assignments?
6650 <pre> decimal32 d32;
6657 In c++std-lib-17229, Robert responds:
6659 <blockquote><p>It is a vestige of an old idea that I forgot to remove
6660 from the paper. Narrowing assignments should be permitted. The bug is
6661 that the converting constructors that cause narrowing should not be
6662 explicit. Thanks for pointing this out.
6665 <p><b>Proposed resolution:</b></p>
6667 1. In "3.2.2 Class <code>decimal32</code>" synopsis, remove the <code>explicit</code> specifier from the narrowing conversions:
6669 <pre> // <i>3.2.2.2 conversion from floating-point type:</i>
6670 <del>explicit</del> decimal32(decimal64 <i>d64</i>);
6671 <del>explicit</del> decimal32(decimal128 <i>d128</i>);
6674 2. Do the same thing in "3.2.2.2. Conversion from floating-point type."
6677 3. In "3.2.3 Class <code>decimal64</code>" synopsis, remove the <code>explicit</code> specifier from the narrowing conversion:
6679 <pre> // <i>3.2.3.2 conversion from floating-point type:</i>
6680 <del>explicit</del> decimal64(decimal128 <i>d128</i>);
6683 4. Do the same thing in "3.2.3.2. Conversion from floating-point type."
6687 Redmond: We prefer explicit conversions for narrowing and implicit for widening.
6696 <h3><a name="614"></a>614. std::string allocator requirements still inconsistent</h3>
6697 <p><b>Section:</b> 21.3 [basic.string] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6698 <b>Submitter:</b> Bo Persson <b>Date:</b> 2006-12-05</p>
6699 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#basic.string">active issues</a> in [basic.string].</p>
6700 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#basic.string">issues</a> in [basic.string].</p>
6701 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6702 <p><b>Discussion:</b></p>
6704 This is based on N2134, where 21.3.1/2 states:
6705 "... The Allocator object used shall be a copy of the Allocator object
6706 passed to the basic_string object's constructor or, if the constructor does
6707 not take an Allocator argument, a copy of a default-constructed Allocator
6711 Section 21.3.2/1 lists two constructors:
6713 <blockquote><pre>basic_string(const basic_string<charT,traits,Allocator>& str );
6715 basic_string(const basic_string<charT,traits,Allocator>& str ,
6716 size_type pos , size_type n = npos,
6717 const Allocator& a = Allocator());
6720 and then says "In the first form, the Allocator value used is copied from
6721 str.get_allocator().", which isn't an option according to 21.3.1.
6724 Batavia: We need blanket statement to the effect of:
6729 <li>If an allocator is passed in, use it, or,</li>
6730 <li>If a string is passed in, use its allocator.</li>
6733 Review constructors and functions that return a string; make sure we follow these
6734 rules (substr, operator+, etc.). Howard to supply wording.
6739 Bo adds: The new container constructor which takes only a <tt>size_type</tt> is not
6740 consistent with 23.1 [container.requirements], p9 which says in part:
6743 All other constructors for these container types take an
6744 <tt>Allocator&</tt> argument (20.1.2), an allocator whose value type
6745 is the same as the container's value type. A copy of this argument is
6746 used for any memory allocation performed, by these constructors and by
6747 all member functions, during the lifetime of each container object.
6753 post Bellevue: We re-confirm that the issue is real. Pablo will provide wording.
6759 <p><b>Proposed resolution:</b></p>
6768 <h3><a name="617"></a>617. std::array is a sequence that doesn't satisfy the sequence requirements?</h3>
6769 <p><b>Section:</b> 23.2.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6770 <b>Submitter:</b> Bo Persson <b>Date:</b> 2006-12-30</p>
6771 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#array">active issues</a> in [array].</p>
6772 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#array">issues</a> in [array].</p>
6773 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6774 <p><b>Discussion:</b></p>
6776 The <tt><array></tt> header is given under 23.2 [sequences].
6777 23.2.1 [array]/paragraph 3 says:
6780 "Unless otherwise specified, all array operations are as described in
6781 23.1 [container.requirements]".
6784 However, array isn't mentioned at all in section 23.1 [container.requirements].
6785 In particular, Table 82 "Sequence requirements" lists several operations (insert, erase, clear)
6786 that std::array does not have in 23.2.1 [array].
6789 Also, Table 83 "Optional sequence operations" lists several operations that
6790 std::array does have, but array isn't mentioned.
6794 <p><b>Proposed resolution:</b></p>
6803 <h3><a name="629"></a>629. complex<t> insertion and locale dependence</t></h3>
6804 <p><b>Section:</b> 26.3.6 [complex.ops] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
6805 <b>Submitter:</b> Gabriel Dos Reis <b>Date:</b> 2007-01-28</p>
6806 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#complex.ops">issues</a> in [complex.ops].</p>
6807 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
6808 <p><b>Discussion:</b></p>
6810 is there an issue opened for (0,3) as complex number with
6811 the French local? With the English local, the above parses as an
6812 imaginery complex number. With the French locale it parses as a
6813 real complex number.
6817 Further notes/ideas from the lib-reflector, messages 17982-17984:
6822 Add additional entries in num_punct to cover the complex separator (French would be ';').
6825 Insert a space before the comma, which should eliminate the ambiguity.
6828 Solve the problem for ordered sequences in general, perhaps with a
6829 dedicated facet. Then complex should use that solution.
6840 After much discussion, we agreed on the following: Add a footnote:
6843 [In a locale in which comma is being used as a decimal point character,
6844 inserting "showbase" into the output stream forces all outputs to show
6845 an explicit decimal point character; then all inserted complex sequences
6846 will extract unambiguously.]
6849 And move this to READY status.
6854 Pre-Sophia Antipolis, Howard adds:
6859 Changed "showbase" to "showpoint" and changed from Ready to Review.
6863 Post-Sophia Antipolis:
6869 I neglected to pull this issue from the formal motions page after the "showbase" to "showpoint" change.
6870 In Sophia Antipolis this change was reviewed by the LWG and the issue was set to Ready. We subsequently
6871 voted the footnote into the WP with "showbase".
6874 I'm changing from WP back to Ready to pick up the "showbase" to "showpoint" change.
6880 <p><b>Proposed resolution:</b></p>
6882 Add a footnote to 26.3.6 [complex.ops] p16:
6886 [In a locale in which comma is being used as a decimal point character,
6887 inserting <tt>showpoint</tt> into the output stream forces all outputs to show
6888 an explicit decimal point character; then all inserted complex sequences
6889 will extract unambiguously.]
6897 <h3><a name="630"></a>630. arrays of valarray</h3>
6898 <p><b>Section:</b> 26.5.2.1 [valarray.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6899 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2007-01-28</p>
6900 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#valarray.cons">active issues</a> in [valarray.cons].</p>
6901 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#valarray.cons">issues</a> in [valarray.cons].</p>
6902 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
6903 <p><b>Discussion:</b></p>
6906 Section 26.1 [numeric.requirements], p1 suggests that a
6907 <code>valarray</code> specialization on a type <code>T</code> that
6908 satisfies the requirements enumerated in the paragraph is itself a
6909 valid type on which <code>valarray</code> may be instantiated
6910 (Footnote 269 makes this clear). I.e.,
6911 <code>valarray<valarray<T> ></code> is valid as long as
6912 <code>T</code> is valid. However, since implementations of
6913 <code>valarray</code> are permitted to initialize storage allocated by
6914 the class by invoking the default ctor of <code>T</code> followed by
6915 the copy assignment operator, such implementations of
6916 <code>valarray</code> wouldn't work with (perhaps user-defined)
6917 specializations of <code>valarray</code> whose assignment operator had
6918 undefined behavior when the size of its argument didn't match the size
6919 of <code>*this</code>. By <i>"wouldn't work"</i> I mean that it would
6920 be impossible to resize such an array of arrays by calling the
6921 <code>resize()</code> member function on it if the function used the
6922 copy assignment operator after constructing all elements using the
6923 default ctor (e.g., by invoking <code>new value_type[N]</code>) to
6924 obtain default-initialized storage) as it's permitted to do.
6929 Stated more generally, the problem is that
6930 <code>valarray<valarray<T> >::resize(size_t)</code> isn't
6931 required or guaranteed to have well-defined semantics for every type
6932 <code>T</code> that satisfies all requirements in
6933 26.1 [numeric.requirements].
6938 I believe this problem was introduced by the adoption of the
6939 resolution outlined in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1996/N0857.asc">N0857</a>,
6940 <i>Assignment of valarrays</i>, from 1996. The copy assignment
6941 operator of the original numerical array classes proposed in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0280.pdf">N0280</a>,
6942 as well as the one proposed in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0308.asc">N0308</a>
6943 (both from 1993), had well-defined semantics for arrays of unequal
6944 size (the latter explicitly only when <code>*this</code> was empty;
6945 assignment of non empty arrays of unequal size was a runtime error).
6950 The justification for the change given in N0857 was the "loss of
6951 performance [deemed] only significant for very simple operations on
6952 small arrays or for architectures with very few registers."
6957 Since tiny arrays on a limited subset of hardware architectures are
6958 likely to be an exceedingly rare case (despite the continued
6959 popularity of x86) I propose to revert the resolution and make the
6960 behavior of all <code>valarray</code> assignment operators
6961 well-defined even for non-conformal arrays (i.e., arrays of unequal
6962 size). I have implemented this change and measured no significant
6963 degradation in performance in the common case (non-empty arrays of
6964 equal size). I have measured a 50% (and in some cases even greater)
6965 speedup in the case of assignments to empty arrays versus calling
6966 <code>resize()</code> first followed by an invocation of the copy
6967 assignment operator.
6977 If no proposed wording by June meeting, this issue should be closed NAD.
6982 <p><b>Proposed resolution:</b></p>
6985 Change 26.5.2.2 [valarray.assign], p1 as follows:
6992 valarray<T>& operator=(const valarray<T>&<ins> x</ins>);
6998 -1- Each element of the <code>*this</code> array is assigned the value
6999 of the corresponding element of the argument array. <del>The
7000 resulting behavior is undefined if </del><ins>When </ins>the length of
7001 the argument array is not equal to the length of the *this
7002 array<del>.</del><ins> resizes <code>*this</code> to make the two
7003 arrays the same length, as if by calling
7004 <code>resize(x.size())</code>, before performing the assignment.</ins>
7010 And add a new paragraph just below paragraph 1 with the following
7017 <ins>-2- <i>Postcondition</i>: <code>size() == x.size()</code>.</ins>
7023 Also add the following paragraph to 26.5.2.2 [valarray.assign], immediately after p4:
7029 <ins>-?- When the length, <i><code>N</code></i> of the array referred
7030 to by the argument is not equal to the length of <code>*this</code>,
7031 the operator resizes <code>*this</code> to make the two arrays the
7032 same length, as if by calling <code>resize(<i>N</i>)</code>, before
7033 performing the assignment.</ins>
7039 pre-Sophia Antipolis, Martin adds the following compromise wording, but
7040 prefers the original proposed resolution:
7045 Change 26.5.2.2 [valarray.assign], p1 as follows:
7050 -1- <i>Requires:</i> <tt>size() == 0 || size() == x.size()</tt>.
7053 -2- <i>Effects:</i> If <tt>size() == 0</tt> calls <tt>x.resize(x.size())</tt> first.
7054 Each element of the <tt>*this</tt> array is assigned the value of the
7055 corresponding element of the argument array.
7058 -3- <i>Postcondition:</i> <tt>size() == x.size()</tt>.
7063 Add the following paragraph to 26.5.2.2 [valarray.assign], immediately after
7069 -?- When <tt>size() == 0</tt> and the length, <tt>N</tt> of the array referred to by
7070 the argument is not equal to the length of <tt>*this</tt>, the operator
7071 resizes <tt>*this</tt> to make the two arrays the same length, as if by
7072 calling <tt>resize(N)</tt>, before performing the assignment. Otherwise,
7073 when <tt>size() > 0</tt> and <tt>size() != N</tt>, the behavior is undefined.
7080 Kona (2007): Gaby to propose wording for an alternative resolution in
7081 which you can assign to a <tt>valarray</tt> of size 0, but not to any other
7082 <tt>valarray</tt> whose size is unequal to the right hand side of the assignment.
7090 <h3><a name="631"></a>631. conflicting requirements for <tt>BinaryPredicate</tt></h3>
7091 <p><b>Section:</b> 25 [algorithms] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7092 <b>Submitter:</b> James Kanze <b>Date:</b> 2007-01-31</p>
7093 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#algorithms">issues</a> in [algorithms].</p>
7094 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7095 <p><b>Discussion:</b></p>
7097 The general requirements for <tt><tt>BinaryPredicate</tt></tt> (in 25 [algorithms]/8) contradict the implied specific requirements for
7098 some functions. In particular, it says that:
7102 [...] if an algorithm takes <tt>BinaryPredicate <i>binary_pred</i></tt>
7103 as its argument and <tt><i>first1</i></tt> and <i>first2</i> as its
7104 iterator arguments, it should work correctly in the construct <tt>if
7105 (binary_pred (*<i>first1</i> , *<i>first2</i> )){...}</tt>.
7106 <tt>BinaryPredicate</tt> always takes the first iterator type as its
7107 first argument, that is, in those cases when <tt>T <i>value</i></tt> is
7108 part of the signature, it should work correctly in the context of <tt>if
7109 (binary_pred (*<i>first1</i> , <i>value</i>)){...}</tt>.
7113 In the description of <tt>upper_bound</tt> (25.3.3.2 [upper.bound]/2), however, the use is described as
7114 "<tt>!comp(<i>value</i>, <i>e</i>)</tt>", where <tt><i>e</i></tt> is an
7115 element of the sequence (a result of dereferencing
7116 <tt>*<i>first</i></tt>).
7120 In the description of <tt>lexicographical_compare</tt>, we have both
7121 "<tt>*<i>first1</i> < *<i>first2</i></tt>" and "<tt>*<i>first2</i>
7122 < *<i>first1</i></tt>" (which presumably implies "<tt>comp(
7123 *<i>first1</i>, *<i>first2</i> )</tt>" and "<tt>comp( *<i>first2</i>,
7124 *<i>first1</i> )</tt>".
7128 Toronto: Moved to Open. ConceptGCC seems to get <tt>lower_bound</tt>
7129 and <tt>upper_bound</tt> to work withoutt these changes.
7135 <p><b>Proposed resolution:</b></p>
7137 Logically, the <tt>BinaryPredicate</tt> is used as an ordering
7138 relationship, with the semantics of "less than". Depending on the
7139 function, it may be used to determine equality, or any of the inequality
7140 relationships; doing this requires being able to use it with either
7141 parameter first. I would thus suggest that the requirement be:
7145 [...] <tt>BinaryPredicate</tt> always takes the first iterator
7146 <tt>value_type</tt> as one of its arguments, it is unspecified which. If
7147 an algorithm takes <tt>BinaryPredicate <i>binary_pred</i></tt> as its
7148 argument and <tt><i><i>first1</i></i></tt> and <i>first2</i> as its
7149 iterator arguments, it should work correctly both in the construct
7150 <tt>if (binary_pred (*<i>first1</i> , *<i>first2</i> )){...}</tt> and
7151 <tt>if (binary_pred (*<i>first2</i>, *<i>first1</i>)){...}</tt>. In
7152 those cases when <tt>T <i>value</i></tt> is part of the signature, it
7153 should work correctly in the context of <tt>if (binary_pred
7154 (*<i>first1</i> , <i>value</i>)){...}</tt> and of <tt>if (binary_pred
7155 (<i>value</i>, *<i>first1</i>)){...}</tt>. [<i>Note:</i> if the two
7156 types are not identical, and neither is convertable to the other, this
7157 may require that the <tt>BinaryPredicate</tt> be a functional object
7158 with two overloaded <tt>operator()()</tt> functions. <i>--end note</i>]
7162 Alternatively, one could specify an order for each function. IMHO, this
7163 would be more work for the committee, more work for the implementors,
7164 and of no real advantage for the user: some functions, such as
7165 <tt>lexicographical_compare</tt> or <tt>equal_range</tt>, will still require both
7166 functions, and it seems like a much easier rule to teach that both
7167 functions are always required, rather than to have a complicated list of
7168 when you only need one, and which one.
7176 <h3><a name="632"></a>632. Time complexity of size() for std::set</h3>
7177 <p><b>Section:</b> 23.1 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7178 <b>Submitter:</b> Lionel B <b>Date:</b> 2007-02-01</p>
7179 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements">active issues</a> in [container.requirements].</p>
7180 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements">issues</a> in [container.requirements].</p>
7181 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7182 <p><b>Discussion:</b></p>
7184 A recent news group discussion:
7188 Anyone know if the Standard has anything to say about the time complexity
7189 of size() for std::set? I need to access a set's size (/not/ to know if it is empty!) heavily
7190 during an algorithm and was thus wondering whether I'd be better off
7191 tracking the size "manually" or whether that'd be pointless.
7194 That would be pointless. size() is O(1).
7197 Nit: the standard says "should" have constant time. Implementations may take
7198 license to do worse. I know that some do this for <tt>std::list<></tt> as a part of
7199 some trade-off with other operation.
7203 I was aware of that, hence my reluctance to use size() for std::set.
7206 However, this reason would not apply to <tt>std::set<></tt> as far as I can see.
7209 Ok, I guess the only option is to try it and see...
7214 If I have any recommendation to the C++ Standards Committee it is that
7215 implementations must (not "should"!) document clearly[1], where known, the
7216 time complexity of *all* container access operations.
7219 [1] In my case (gcc 4.1.1) I can't swear that the time complexity of size()
7220 for std::set is not documented... but if it is it's certainly well hidden
7226 <p><b>Proposed resolution:</b></p>
7232 Kona (2007): This issue affects all the containers. We'd love to see a
7233 paper dealing with the broad issue. We think that the complexity of the
7234 <tt>size()</tt> member of every container -- except possibly <tt>list</tt> -- should be
7235 O(1). Alan has volunteered to provide wording.
7245 Mandating O(1) size will not fly, too many implementations would be
7246 invalidated. Alan to provide wording that toughens wording, but that
7247 does not absolutely mandate O(1).
7254 <h3><a name="635"></a>635. domain of <tt>allocator::address</tt></h3>
7255 <p><b>Section:</b> 20.1.2 [allocator.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7256 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2007-02-08</p>
7257 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#allocator.requirements">active issues</a> in [allocator.requirements].</p>
7258 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#allocator.requirements">issues</a> in [allocator.requirements].</p>
7259 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7260 <p><b>Discussion:</b></p>
7262 The table of allocator requirements in 20.1.2 [allocator.requirements] describes
7263 <tt>allocator::address</tt> as:
7265 <blockquote><pre>a.address(r)
7269 where <tt>r</tt> and <tt>s</tt> are described as:
7272 a value of type <tt>X::reference</tt> obtained by the expression <tt>*p</tt>.
7280 a value of type <tt>X::pointer</tt>, obtained by calling <tt>a1.allocate</tt>,
7281 where <tt>a1 == a</tt>
7285 This all implies that to get the address of some value of type <tt>T</tt> that
7286 value must have been allocated by this allocator or a copy of it.
7290 However sometimes container code needs to compare the address of an external value of
7291 type <tt>T</tt> with an internal value. For example <tt>list::remove(const T& t)</tt>
7292 may want to compare the address of the external value <tt>t</tt> with that of a value
7293 stored within the list. Similarly <tt>vector</tt> or <tt>deque insert</tt> may
7294 want to make similar comparisons (to check for self-referencing calls).
7298 Mandating that <tt>allocator::address</tt> can only be called for values which the
7299 allocator allocated seems overly restrictive.
7304 <p><b>Proposed resolution:</b></p>
7306 Change 20.1.2 [allocator.requirements]:
7311 <tt>r</tt> : a value of type <tt>X::reference</tt> <del>obtained by the expression *p</del>.
7314 <tt>s</tt> : a value of type <tt>X::const_reference</tt> <del>obtained by the
7315 expression <tt>*q</tt> or by conversion from a value <tt>r</tt></del>.
7320 post Oxford: This would be rendered NAD Editorial by acceptance of
7321 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2257.html">N2257</a>.
7326 Kona (2007): This issue is section 8 of N2387. There was some discussion of it but
7327 no resolution to this issue was recorded. Moved to Open.
7337 <h3><a name="644"></a>644. Possible typos in 'function' description</h3>
7338 <p><b>Section:</b> X [func.wrap.func.undef] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7339 <b>Submitter:</b> Bo Persson <b>Date:</b> 2007-02-25</p>
7340 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7341 <p><b>Discussion:</b></p>
7343 X [func.wrap.func.undef]
7346 The note in paragraph 2 refers to 'undefined void operators', while the
7347 section declares a pair of operators returning bool.
7351 Post-Sophia Antipolis:
7356 Changed from Pending WP to Open. This issue was voted to WP at the same time the operators were
7357 changed from private to deleted. The two issues stepped on each other. What do we want the return
7358 type of these deleted functions to be?
7363 <p><b>Proposed resolution:</b></p>
7365 Change 20.6.15.2 [func.wrap.func]
7368 <blockquote><pre>...
7370 // X [func.wrap.func.undef], undefined operators:
7371 template<class Function2> <del>bool</del> <ins>void</ins> operator==(const function<Function2>&);
7372 template<class Function2> <del>bool</del> <ins>void</ins> operator!=(const function<Function2>&);
7377 Change X [func.wrap.func.undef]
7380 <blockquote><pre>template<class Function2> <del>bool</del> <ins>void</ins> operator==(const function<Function2>&);
7381 template<class Function2> <del>bool</del> <ins>void</ins> operator!=(const function<Function2>&);
7389 <h3><a name="659"></a>659. istreambuf_iterator should have an operator->()</h3>
7390 <p><b>Section:</b> 24.5.3 [istreambuf.iterator] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7391 <b>Submitter:</b> Niels Dekker <b>Date:</b> 2007-03-25</p>
7392 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#istreambuf.iterator">issues</a> in [istreambuf.iterator].</p>
7393 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7394 <p><b>Discussion:</b></p>
7396 Greg Herlihy has clearly demonstrated that a user defined input
7397 iterator should have an operator->(), even if its
7398 value type is a built-in type (comp.std.c++, "Re: Should any iterator
7399 have an operator->() in C++0x?", March 2007). And as Howard
7400 Hinnant remarked in the same thread that the input iterator
7401 <tt>istreambuf_iterator</tt> doesn't have one, this must be a
7405 Based on Greg's example, the following code demonstrates the issue:
7406 </p><pre> #include <iostream>
7407 #include <fstream>
7408 #include <streambuf>
7413 std::ifstream s("filename", std::ios::in);
7414 std::istreambuf_iterator<char> i(s);
7416 (*i).~C(); // This is well-formed...
7417 i->~C(); // ... so this should be supported!
7422 Of course, operator-> is also needed when the value_type of
7423 istreambuf_iterator is a class.
7426 The operator-> could be implemented in various ways. For instance,
7427 by storing the current value inside the iterator, and returning its
7428 address. Or by returning a proxy, like operator_arrow_proxy, from
7429 <a href="http://www.boost.org/boost/iterator/iterator_facade.hpp">http://www.boost.org/boost/iterator/iterator_facade.hpp</a>
7432 I hope that the resolution of this issue will contribute to getting a
7433 clear and consistent definition of iterator concepts.
7437 <p><b>Proposed resolution:</b></p>
7439 Add to the synopsis in 24.5.3 [istreambuf.iterator]:
7442 <blockquote><pre>charT operator*() const;
7443 <ins>pointer operator->() const;</ins>
7444 istreambuf_iterator<charT,traits>& operator++();
7448 Change 24.5.3 [istreambuf.iterator], p1:
7452 The class template <tt>istreambuf_iterator</tt> reads successive
7453 characters from the <tt>streambuf</tt> for which it was constructed.
7454 <tt>operator*</tt> provides access to the current input character, if
7455 any. <ins><tt>operator-></tt> may return a proxy.</ins> Each time
7456 <tt>operator++</tt> is evaluated, the iterator advances to the next
7457 input character. If the end of stream is reached
7458 (<tt>streambuf_type::sgetc()</tt> returns <tt>traits::eof()</tt>), the
7459 iterator becomes equal to the end of stream iterator value. The default
7460 constructor <tt>istreambuf_iterator()</tt> and the constructor
7461 <tt>istreambuf_iterator(0)</tt> both construct an end of stream iterator
7462 object suitable for use as an end-of-range.
7468 Kona (2007): The proposed resolution is inconsistent because the return
7469 type of <tt>istreambuf_iterator::operator->()</tt> is specified to be <tt>pointer</tt>,
7470 but the proposed text also states that "<tt>operator-></tt> may return a proxy."
7475 Niels Dekker (mailed to Howard Hinnant):
7480 The proposed resolution does
7481 not seem inconsistent to me. <tt>istreambuf_iterator::operator->()</tt> should
7482 have <tt>istreambuf_iterator::pointer</tt> as return type, and this return type
7483 may in fact be a proxy.
7486 AFAIK, the resolution of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#445">445</a> ("<tt>iterator_traits::reference</tt>
7487 unspecified for some iterator categories") implies that for any iterator
7488 class <tt>Iter</tt>, the return type of <tt>operator->()</tt> is <tt>Iter::pointer</tt>, by
7489 definition. I don't think <tt>Iter::pointer</tt> needs to be a raw pointer.
7492 Still I wouldn't mind if the text "<tt>operator-></tt> may return a proxy" would
7493 be removed from the resolution. I think it's up to the library
7494 implementation, how to implement <tt>istreambuf_iterator::operator->()</tt>. As
7495 longs as it behaves as expected: <tt>i->m</tt> should have the same effect as
7496 <tt>(*i).m</tt>. Even for an explicit destructor call, <tt>i->~C()</tt>. The main issue
7497 is just: <tt>istreambuf_iterator</tt> should have an <tt>operator->()</tt>!
7505 <h3><a name="667"></a>667. <tt>money_get</tt>'s widened minus sign</h3>
7506 <p><b>Section:</b> 22.2.6.1.2 [locale.money.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7507 <b>Submitter:</b> Thomas Plum <b>Date:</b> 2007-04-16</p>
7508 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#locale.money.get.virtuals">active issues</a> in [locale.money.get.virtuals].</p>
7509 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.money.get.virtuals">issues</a> in [locale.money.get.virtuals].</p>
7510 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7511 <p><b>Discussion:</b></p>
7513 22.2.6.1.2 [locale.money.get.virtuals], para 1 says:
7517 The result is returned as an integral value
7518 stored in <tt>units</tt> or as a sequence of digits possibly preceded by a
7519 minus sign (as produced by <tt>ct.widen(c)</tt> where <tt>c</tt> is '-' or in the range
7520 from '0' through '9', inclusive) stored in <tt>digits</tt>.
7525 objection has been raised:
7529 Some implementations interpret this to mean that a facet derived from
7530 <tt>ctype<wchar_t></tt> can provide its own member <tt>do_widen(char)</tt>
7531 which produces e.g. <tt>L'@'</tt> for the "widened" minus sign, and that the
7532 <tt>'@'</tt> symbol will appear in the resulting sequence of digits. Other
7533 implementations have assumed that one or more places in the standard permit the
7534 implementation to "hard-wire" <tt>L'-'</tt> as the "widened" minus sign. Are
7535 both interpretations permissible, or only one?
7539 [Plum ref _222612Y14]
7543 Furthermore: if <tt>ct.widen('9')</tt> produces <tt>L'X'</tt> (a non-digit), does a
7544 parse fail if a <tt>'9'</tt> appears in the subject string? [Plum ref _22263Y33]
7548 Kona (2007): Bill and Dietmar to provide proposed wording.
7553 post Bellevue: Bill adds:
7558 The Standard is clear that the minus sign stored in <tt>digits</tt> is <tt>ct.widen('-')</tt>.
7559 The subject string must contain characters <tt>c</tt> in the set <tt>[-0123456789]</tt>
7560 which are translated by <tt>ct.widen(c)</tt> calls before being stored in <tt>digits</tt>;
7561 the widened characters are not relevant to the parsing of the subject string.
7565 <p><b>Proposed resolution:</b></p>
7574 <h3><a name="668"></a>668. <tt>money_get</tt>'s empty minus sign</h3>
7575 <p><b>Section:</b> 22.2.6.1.2 [locale.money.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7576 <b>Submitter:</b> Thomas Plum <b>Date:</b> 2007-04-16</p>
7577 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#locale.money.get.virtuals">active issues</a> in [locale.money.get.virtuals].</p>
7578 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.money.get.virtuals">issues</a> in [locale.money.get.virtuals].</p>
7579 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7580 <p><b>Discussion:</b></p>
7582 22.2.6.1.2 [locale.money.get.virtuals], para 3 says:
7586 If <tt>pos</tt> or <tt>neg</tt> is empty, the sign component is
7587 optional, and if no sign is detected, the result is given the sign
7588 that corresponds to the source of the empty string.
7593 objection has been raised:
7597 A <tt>negative_sign</tt> of "" means "there is no
7598 way to write a negative sign" not "any null sequence is a negative
7599 sign, so it's always there when you look for it".
7603 [Plum ref _222612Y32]
7607 Kona (2007): Bill to provide proposed wording and interpretation of existing wording.
7613 <p><b>Proposed resolution:</b></p>
7622 <h3><a name="669"></a>669. Equivalent postive and negative signs in <tt>money_get</tt></h3>
7623 <p><b>Section:</b> 22.2.6.1.2 [locale.money.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7624 <b>Submitter:</b> Thomas Plum <b>Date:</b> 2007-04-16</p>
7625 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#locale.money.get.virtuals">active issues</a> in [locale.money.get.virtuals].</p>
7626 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.money.get.virtuals">issues</a> in [locale.money.get.virtuals].</p>
7627 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7628 <p><b>Discussion:</b></p>
7630 22.2.6.1.2 [locale.money.get.virtuals], para 3 sentence 4 says:
7634 If the first character of <tt>pos</tt> is equal to the first character of <tt>neg</tt>,
7635 or if both strings are empty, the result is given a positive sign.
7639 One interpretation is that an input sequence must match either the
7640 positive pattern or the negative pattern, and then in either event it
7641 is interpreted as positive. The following objections has been raised:
7645 The input can successfully match only a positive sign, so the negative
7646 pattern is an unsuccessful match.
7650 [Plum ref _222612Y34, 222612Y51b]
7654 Bill to provide proposed wording and interpretation of existing wording.
7660 <p><b>Proposed resolution:</b></p>
7669 <h3><a name="670"></a>670. <tt>money_base::pattern</tt> and <tt>space</tt></h3>
7670 <p><b>Section:</b> 22.2.6.3 [locale.moneypunct] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7671 <b>Submitter:</b> Thomas Plum <b>Date:</b> 2007-04-16</p>
7672 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7673 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#836">836</a></p>
7674 <p><b>Discussion:</b></p>
7678 22.2.6.3 [locale.moneypunct], para 2 says:
7682 The value <tt>space</tt> indicates that at least one space is required at
7687 The following objection has been raised:
7691 Whitespace is optional when matching space. (See 22.2.6.1.2 [locale.money.get.virtuals], para 2.)
7695 [Plum ref _22263Y22]
7699 Kona (2007): Bill to provide proposed wording. We agree that C++03 is
7700 ambiguous, and that we want C++0X to say "space" means 0 or more
7701 whitespace characters on input.
7707 <p><b>Proposed resolution:</b></p>
7716 <h3><a name="671"></a>671. precision of hexfloat</h3>
7717 <p><b>Section:</b> 22.2.2.2.2 [facet.num.put.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7718 <b>Submitter:</b> John Salmon <b>Date:</b> 2007-04-20</p>
7719 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#facet.num.put.virtuals">issues</a> in [facet.num.put.virtuals].</p>
7720 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7721 <p><b>Discussion:</b></p>
7723 I am trying to understand how TR1 supports hex float (%a) output.
7726 As far as I can tell, it does so via the following:
7729 8.15 Additions to header <locale> [tr.c99.locale]
7732 In subclause 22.2.2.2.2 [facet.num.put.virtuals], Table 58 Floating-point conversions, after
7734 floatfield == ios_base::scientific %E
7739 <blockquote><pre>floatfield == ios_base::fixed | ios_base::scientific && !uppercase %a
7740 floatfield == ios_base::fixed | ios_base::scientific %A 2
7743 [Note: The additional requirements on print and scan functions, later
7744 in this clause, ensure that the print functions generate hexadecimal
7745 floating-point fields with a %a or %A conversion specifier, and that
7746 the scan functions match hexadecimal floating-point fields with a %g
7747 conversion specifier. end note]
7750 Following the thread, in 22.2.2.2.2 [facet.num.put.virtuals], we find:
7753 For conversion from a floating-point type, if (flags & fixed) != 0 or
7754 if str.precision() > 0, then str.precision() is specified in the
7755 conversion specification.
7758 This would seem to imply that when floatfield == fixed|scientific, the
7759 precision of the conversion specifier is to be taken from
7760 str.precision(). Is this really what's intended? I sincerely hope
7761 that I'm either missing something or this is an oversight. Please
7762 tell me that the committee did not intend to mandate that hex floats
7763 (and doubles) should by default be printed as if by %.6a.
7767 Howard: I think the fundamental issue we overlooked was that with %f,
7768 %e, %g, the default precision was always 6. With %a the default
7769 precision is not 6, it is infinity. So for the first time, we need to
7770 distinguish between the default value of precision, and the precision
7777 <p><b>Proposed resolution:</b></p>
7783 Kona (2007): Robert volunteers to propose wording.
7791 <h3><a name="675"></a>675. Move assignment of containers</h3>
7792 <p><b>Section:</b> 23.1 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
7793 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2007-05-05</p>
7794 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements">active issues</a> in [container.requirements].</p>
7795 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements">issues</a> in [container.requirements].</p>
7796 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
7797 <p><b>Discussion:</b></p>
7799 James Hopkin pointed out to me that if <tt>vector<T></tt> move assignment is O(1)
7800 (just a <tt>swap</tt>) then containers such as <tt>vector<shared_ptr<ostream>></tt> might have
7801 the wrong semantics under move assignment when the source is not truly an rvalue, but a
7802 moved-from lvalue (destructors could run late).
7805 <blockquote><pre><tt>vector<shared_ptr<ostream>></tt> v1;
7806 <tt>vector<shared_ptr<ostream>></tt> v2;
7809 v1 = std::move(v2); // #2
7813 Move semantics means not caring what happens to the source (<tt>v2</tt> in this example).
7814 It doesn't mean not caring what happens to the target (<tt>v1</tt>). In the above example
7815 both assignments should have the same effect on <tt>v1</tt>. Any non-shared <tt>ostream</tt>'s
7816 <tt>v1</tt> owns before the assignment should be closed, whether <tt>v1</tt> is undergoing
7817 copy assignment or move assignment.
7821 This implies that the semantics of move assignment of a generic container should be
7822 <tt>clear, swap</tt> instead of just swap. An alternative which could achieve the same
7823 effect would be to move assign each element. In either case, the complexity of move
7824 assignment needs to be relaxed to <tt>O(v1.size())</tt>.
7828 The performance hit of this change is not nearly as drastic as it sounds.
7829 In practice, the target of a move assignment has always just been move constructed
7830 or move assigned <i>from</i>. Therefore under <tt>clear, swap</tt> semantics (in
7831 this common use case) we are still achieving O(1) complexity.
7836 <p><b>Proposed resolution:</b></p>
7838 Change 23.1 [container.requirements]:
7843 <caption>Table 89: Container requirements</caption>
7845 <th>expression</th><th>return type</th><th>operational semantics</th>
7846 <th>assertion/note pre/post-condition</th><th>complexity</th>
7849 <td><tt>a = rv;</tt></td><td><tt>X&</tt></td>
7850 <td>All existing elements of <tt>a</tt> are either move assigned or destructed</td>
7851 <td><tt>a</tt> shall be equal to the
7852 value that <tt>rv</tt> had
7853 before this construction
7855 <td><del>(Note C)</del> <ins>linear</ins></td>
7860 Notes: the algorithms <tt>swap()</tt>, <tt>equal()</tt> and
7861 <tt>lexicographical_compare()</tt> are defined in clause 25. Those
7862 entries marked "(Note A)" should have constant complexity. Those entries
7863 marked "(Note B)" have constant complexity unless
7864 <tt>allocator_propagate_never<X::allocator_type>::value</tt> is
7865 <tt>true</tt>, in which case they have linear complexity.
7867 marked "(Note C)" have constant complexity if <tt>a.get_allocator() ==
7868 rv.get_allocator()</tt> or if either
7869 <tt>allocator_propagate_on_move_assignment<X::allocator_type>::value</tt>
7871 <tt>allocator_propagate_on_copy_assignment<X::allocator_type>::value</tt>
7872 is <tt>true</tt> and linear complexity otherwise.</del>
7879 post Bellevue Howard adds:
7885 This issue was voted to WP in Bellevue, but accidently got stepped on by
7886 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2525.pdf">N2525</a>
7887 which was voted to WP simulataneously. Moving back to Open for the purpose of getting
7888 the wording right. The intent of this issue and N2525 are not in conflict.
7893 post Sophia Antipolis Howard updated proposed wording:
7901 <h3><a name="676"></a>676. Moving the unordered containers</h3>
7902 <p><b>Section:</b> 23.4 [unord] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7903 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2007-05-05</p>
7904 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unord">active issues</a> in [unord].</p>
7905 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unord">issues</a> in [unord].</p>
7906 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
7907 <p><b>Discussion:</b></p>
7909 Move semantics are missing from the <tt>unordered</tt> containers. The proposed
7910 resolution below adds move-support consistent with
7911 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1858.html">N1858</a>
7912 and the current working draft.
7916 The current proposed resolution simply lists the requirements for each function.
7917 These might better be hoisted into the requirements table for unordered associative containers.
7918 Futhermore a mild reorganization of the container requirements could well be in order.
7919 This defect report is purposefully ignoring these larger issues and just focusing
7920 on getting the unordered containers "moved".
7925 <p><b>Proposed resolution:</b></p>
7928 Add to 23.4 [unord]:
7931 <blockquote><pre>template <class Key, class T, class Hash, class Pred, class Alloc>
7932 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
7933 unordered_map<Key, T, Hash, Pred, Alloc>& y);
7935 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
7936 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
7937 unordered_map<Key, T, Hash, Pred, Alloc>&& y);</ins>
7939 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
7940 void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x,
7941 unordered_map<Key, T, Hash, Pred, Alloc>& y);</ins>
7943 template <class Key, class T, class Hash, class Pred, class Alloc>
7944 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
7945 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
7947 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
7948 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
7949 unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);</ins>
7951 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
7952 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x,
7953 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);</ins>
7957 template <class Value, class Hash, class Pred, class Alloc>
7958 void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
7959 unordered_set<Value, Hash, Pred, Alloc>& y);
7961 <ins>template <class Value, class Hash, class Pred, class Alloc>
7962 void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
7963 unordered_set<Value, Hash, Pred, Alloc>&& y);</ins>
7965 <ins>template <class Value, class Hash, class Pred, class Alloc>
7966 void swap(unordered_set<Value, Hash, Pred, Alloc>&& x,
7967 unordered_set<Value, Hash, Pred, Alloc>& y);</ins>
7969 template <class Value, class Hash, class Pred, class Alloc>
7970 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
7971 unordered_multiset<Value, Hash, Pred, Alloc>& y);
7973 <ins>template <class Value, class Hash, class Pred, class Alloc>
7974 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
7975 unordered_multiset<Value, Hash, Pred, Alloc>&& y);</ins>
7977 <ins>template <class Value, class Hash, class Pred, class Alloc>
7978 void swap(unordered_multiset<Value, Hash, Pred, Alloc>&& x,
7979 unordered_multiset<Value, Hash, Pred, Alloc>& y);</ins>
7982 <p><b><tt>unordered_map</tt></b></p>
7985 Change 23.4.1 [unord.map]:
7988 <blockquote><pre>class unordered_map
7991 unordered_map(const unordered_map&);
7992 <ins>unordered_map(unordered_map&&);</ins>
7994 unordered_map& operator=(const unordered_map&);
7995 <ins>unordered_map& operator=(unordered_map&&);</ins>
7998 <del>std::</del>pair<iterator, bool> insert(const value_type& obj);
7999 <ins>template <class P> pair<iterator, bool> insert(P&& obj);</ins>
8000 iterator insert(iterator hint, const value_type& obj);
8001 <ins>template <class P> iterator insert(iterator hint, P&& obj);</ins>
8002 const_iterator insert(const_iterator hint, const value_type& obj);
8003 <ins>template <class P> const_iterator insert(const_iterator hint, P&& obj);</ins>
8005 void swap(unordered_map&<ins>&</ins>);
8007 mapped_type& operator[](const key_type& k);
8008 <ins>mapped_type& operator[](key_type&& k);</ins>
8012 template <class Key, class T, class Hash, class Pred, class Alloc>
8013 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
8014 unordered_map<Key, T, Hash, Pred, Alloc>& y);
8016 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8017 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
8018 unordered_map<Key, T, Hash, Pred, Alloc>&& y);</ins>
8020 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8021 void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x,
8022 unordered_map<Key, T, Hash, Pred, Alloc>& y);</ins>
8026 Add to 23.4.1.1 [unord.map.cnstr]:
8030 <pre>template <class InputIterator>
8031 unordered_map(InputIterator f, InputIterator l,
8032 size_type n = <i>implementation-defined</i>,
8033 const hasher& hf = hasher(),
8034 const key_equal& eql = key_equal(),
8035 const allocator_type& a = allocator_type());
8040 <i>Requires:</i> If the iterator's dereference operator returns an
8041 lvalue or a const rvalue <tt>pair<key_type, mapped_type></tt>,
8042 then both <tt>key_type</tt> and <tt>mapped_type</tt> shall be
8043 <tt>CopyConstructible</tt>.
8049 Add to 23.4.1.2 [unord.map.elem]:
8054 <pre>mapped_type& operator[](const key_type& k);</pre>
8059 <i>Requires:</i> <tt>key_type</tt> shall be <tt>CopyConstructible</tt>
8060 and <tt>mapped_type</tt> shall be <tt>DefaultConstructible</tt>.
8064 <pre><ins>mapped_type& operator[](key_type&& k);</ins></pre>
8068 <i>Effects:</i> If the <tt>unordered_map</tt> does not already contain an
8069 element whose key is equivalent to <tt>k</tt> , inserts the value
8070 <tt>std::pair<const key_type, mapped_type>(std::move(k), mapped_type())</tt>.
8074 <i>Requires:</i> <tt>mapped_type</tt> shall be <tt>DefaultConstructible</tt>.
8078 <i>Returns:</i> A reference to <tt>x.second</tt>, where <tt>x</tt> is the
8079 (unique) element whose key is equivalent to <tt>k</tt>.
8087 Add new section [unord.map.modifiers]:
8091 <pre><ins>pair<iterator, bool> insert(const value_type& x);</ins>
8092 <ins>template <class P> pair<iterator, bool> insert(P&& x);</ins>
8093 <ins>iterator insert(iterator hint, const value_type& x);</ins>
8094 <ins>template <class P> iterator insert(iterator hint, P&& x);</ins>
8095 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
8096 <ins>template <class P> const_iterator insert(const_iterator hint, P&& x);</ins>
8097 <ins>template <class InputIterator>
8098 void insert(InputIterator first, InputIterator last);</ins>
8103 <i>Requires:</i> Those signatures taking a <tt>const value_type&</tt> parameter
8104 requires both the <tt>key_type</tt> and the <tt>mapped_type</tt> to be
8105 <tt>CopyConstructible</tt>.
8109 <tt>P</tt> shall be convertible to <tt>value_type</tt>.
8110 If <tt>P</tt> is instantiated as a reference
8111 type, then the argument <tt>x</tt> is copied from. Otherwise <tt>x</tt>
8112 is considered to be an rvalue as it is converted to <tt>value_type</tt>
8113 and inserted into the <tt>unordered_map</tt>. Specifically, in such
8114 cases <tt>CopyConstructible</tt> is not required of <tt>key_type</tt> or
8115 <tt>mapped_type</tt> unless the conversion from <tt>P</tt> specifically
8116 requires it (e.g. if <tt>P</tt> is a <tt>tuple<const key_type,
8117 mapped_type></tt>, then <tt>key_type</tt> must be
8118 <tt>CopyConstructible</tt>).
8122 The signature taking <tt>InputIterator</tt>
8123 parameters requires <tt>CopyConstructible</tt> of both
8124 <tt>key_type</tt> and <tt>mapped_type</tt> if the dereferenced
8125 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
8126 <tt>value_type</tt>.
8134 Add to 23.4.1.3 [unord.map.swap]:
8138 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
8139 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
8140 unordered_map<Key, T, Hash, Pred, Alloc>& y);
8141 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8142 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
8143 unordered_map<Key, T, Hash, Pred, Alloc>&& y);</ins>
8144 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8145 void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x,
8146 unordered_map<Key, T, Hash, Pred, Alloc>& y);</ins>
8150 <p><b><tt>unordered_multimap</tt></b></p>
8153 Change 23.4.2 [unord.multimap]:
8156 <blockquote><pre>class unordered_multimap
8159 unordered_multimap(const unordered_multimap&);
8160 <ins>unordered_multimap(unordered_multimap&&);</ins>
8161 ~unordered_multimap();
8162 unordered_multimap& operator=(const unordered_multimap&);
8163 <ins>unordered_multimap& operator=(unordered_multimap&&);</ins>
8166 iterator insert(const value_type& obj);
8167 <ins>template <class P> iterator insert(P&& obj);</ins>
8168 iterator insert(iterator hint, const value_type& obj);
8169 <ins>template <class P> iterator insert(iterator hint, P&& obj);</ins>
8170 const_iterator insert(const_iterator hint, const value_type& obj);
8171 <ins>template <class P> const_iterator insert(const_iterator hint, P&& obj);</ins>
8173 void swap(unordered_multimap&<ins>&</ins>);
8177 template <class Key, class T, class Hash, class Pred, class Alloc>
8178 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
8179 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
8181 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8182 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
8183 unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);</ins>
8185 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8186 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x,
8187 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);</ins>
8191 Add to 23.4.2.1 [unord.multimap.cnstr]:
8195 <pre>template <class InputIterator>
8196 unordered_multimap(InputIterator f, InputIterator l,
8197 size_type n = <i>implementation-defined</i>,
8198 const hasher& hf = hasher(),
8199 const key_equal& eql = key_equal(),
8200 const allocator_type& a = allocator_type());
8205 <i>Requires:</i> If the iterator's dereference operator returns an
8206 lvalue or a const rvalue <tt>pair<key_type, mapped_type></tt>,
8207 then both <tt>key_type</tt> and <tt>mapped_type</tt> shall be
8208 <tt>CopyConstructible</tt>.
8214 Add new section [unord.multimap.modifiers]:
8218 <pre><ins>iterator insert(const value_type& x);</ins>
8219 <ins>template <class P> iterator insert(P&& x);</ins>
8220 <ins>iterator insert(iterator hint, const value_type& x);</ins>
8221 <ins>template <class P> iterator insert(iterator hint, P&& x);</ins>
8222 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
8223 <ins>template <class P> const_iterator insert(const_iterator hint, P&& x);</ins>
8224 <ins>template <class InputIterator>
8225 void insert(InputIterator first, InputIterator last);</ins>
8230 <i>Requires:</i> Those signatures taking a <tt>const value_type&</tt> parameter
8231 requires both the <tt>key_type</tt> and the <tt>mapped_type</tt> to be
8232 <tt>CopyConstructible</tt>.
8236 <tt>P</tt> shall be convertible to <tt>value_type</tt>.
8237 If <tt>P</tt> is instantiated as a reference
8238 type, then the argument <tt>x</tt> is copied from. Otherwise <tt>x</tt>
8239 is considered to be an rvalue as it is converted to <tt>value_type</tt>
8240 and inserted into the <tt>unordered_multimap</tt>. Specifically, in such
8241 cases <tt>CopyConstructible</tt> is not required of <tt>key_type</tt> or
8242 <tt>mapped_type</tt> unless the conversion from <tt>P</tt> specifically
8243 requires it (e.g. if <tt>P</tt> is a <tt>tuple<const key_type,
8244 mapped_type></tt>, then <tt>key_type</tt> must be
8245 <tt>CopyConstructible</tt>).
8249 The signature taking <tt>InputIterator</tt>
8250 parameters requires <tt>CopyConstructible</tt> of both
8251 <tt>key_type</tt> and <tt>mapped_type</tt> if the dereferenced
8252 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
8253 <tt>value_type</tt>.
8260 Add to 23.4.2.2 [unord.multimap.swap]:
8264 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
8265 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
8266 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
8267 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8268 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
8269 unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);</ins>
8270 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8271 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x,
8272 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);</ins>
8276 <p><b><tt>unordered_set</tt></b></p>
8279 Change 23.4.3 [unord.set]:
8282 <blockquote><pre>class unordered_set
8285 unordered_set(const unordered_set&);
8286 <ins>unordered_set(unordered_set&&);</ins>
8288 unordered_set& operator=(const unordered_set&);
8289 <ins>unordered_set& operator=(unordered_set&&);</ins>
8292 <del>std::</del>pair<iterator, bool> insert(const value_type& obj);
8293 <ins>pair<iterator, bool> insert(value_type&& obj);</ins>
8294 iterator insert(iterator hint, const value_type& obj);
8295 <ins>iterator insert(iterator hint, value_type&& obj);</ins>
8296 const_iterator insert(const_iterator hint, const value_type& obj);
8297 <ins>const_iterator insert(const_iterator hint, value_type&& obj);</ins>
8299 void swap(unordered_set&<ins>&</ins>);
8303 template <class Key, class T, class Hash, class Pred, class Alloc>
8304 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
8305 unordered_set<Key, T, Hash, Pred, Alloc>& y);
8307 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8308 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
8309 unordered_set<Key, T, Hash, Pred, Alloc>&& y);</ins>
8311 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8312 void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x,
8313 unordered_set<Key, T, Hash, Pred, Alloc>& y);</ins>
8317 Add to 23.4.3.1 [unord.set.cnstr]:
8321 <pre>template <class InputIterator>
8322 unordered_set(InputIterator f, InputIterator l,
8323 size_type n = <i>implementation-defined</i>,
8324 const hasher& hf = hasher(),
8325 const key_equal& eql = key_equal(),
8326 const allocator_type& a = allocator_type());
8331 <i>Requires:</i> If the iterator's dereference operator returns an
8332 lvalue or a const rvalue <tt>value_type</tt>, then the
8333 <tt>value_type</tt> shall be <tt>CopyConstructible</tt>.
8339 Add new section [unord.set.modifiers]:
8343 <pre><ins>pair<iterator, bool> insert(const value_type& x);</ins>
8344 <ins>pair<iterator, bool> insert(value_type&& x);</ins>
8345 <ins>iterator insert(iterator hint, const value_type& x);</ins>
8346 <ins>iterator insert(iterator hint, value_type&& x);</ins>
8347 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
8348 <ins>const_iterator insert(const_iterator hint, value_type&& x);</ins>
8349 <ins>template <class InputIterator>
8350 void insert(InputIterator first, InputIterator last);</ins>
8356 <i>Requires:</i> Those signatures taking a <tt>const
8357 value_type&</tt> parameter requires the <tt>value_type</tt> to
8358 be <tt>CopyConstructible</tt>.
8362 The signature taking <tt>InputIterator</tt> parameters requires
8363 <tt>CopyConstructible</tt> of <tt>value_type</tt> if the dereferenced
8364 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
8365 <tt>value_type</tt>.
8373 Add to 23.4.3.2 [unord.set.swap]:
8377 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
8378 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
8379 unordered_set<Key, T, Hash, Pred, Alloc>& y);
8380 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8381 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
8382 unordered_set<Key, T, Hash, Pred, Alloc>&& y);</ins>
8383 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8384 void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x,
8385 unordered_set<Key, T, Hash, Pred, Alloc>& y);</ins>
8389 <p><b><tt>unordered_multiset</tt></b></p>
8392 Change 23.4.4 [unord.multiset]:
8395 <blockquote><pre>class unordered_multiset
8398 unordered_multiset(const unordered_multiset&);
8399 <ins>unordered_multiset(unordered_multiset&&);</ins>
8400 ~unordered_multiset();
8401 unordered_multiset& operator=(const unordered_multiset&);
8402 <ins>unordered_multiset& operator=(unordered_multiset&&);</ins>
8405 iterator insert(const value_type& obj);
8406 <ins>iterator insert(value_type&& obj);</ins>
8407 iterator insert(iterator hint, const value_type& obj);
8408 <ins>iterator insert(iterator hint, value_type&& obj);</ins>
8409 const_iterator insert(const_iterator hint, const value_type& obj);
8410 <ins>const_iterator insert(const_iterator hint, value_type&& obj);</ins>
8412 void swap(unordered_multiset&<ins>&</ins>);
8416 template <class Key, class T, class Hash, class Pred, class Alloc>
8417 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
8418 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
8420 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8421 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
8422 unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);</ins>
8424 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8425 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x,
8426 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);</ins>
8430 Add to 23.4.4.1 [unord.multiset.cnstr]:
8434 <pre>template <class InputIterator>
8435 unordered_multiset(InputIterator f, InputIterator l,
8436 size_type n = <i>implementation-defined</i>,
8437 const hasher& hf = hasher(),
8438 const key_equal& eql = key_equal(),
8439 const allocator_type& a = allocator_type());
8444 <i>Requires:</i> If the iterator's dereference operator returns an
8445 lvalue or a const rvalue <tt>value_type</tt>, then the
8446 <tt>value_type</tt> shall be <tt>CopyConstructible</tt>.
8452 Add new section [unord.multiset.modifiers]:
8456 <pre><ins>iterator insert(const value_type& x);</ins>
8457 <ins>iterator insert(value_type&& x);</ins>
8458 <ins>iterator insert(iterator hint, const value_type& x);</ins>
8459 <ins>iterator insert(iterator hint, value_type&& x);</ins>
8460 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
8461 <ins>const_iterator insert(const_iterator hint, value_type&& x);</ins>
8462 <ins>template <class InputIterator>
8463 void insert(InputIterator first, InputIterator last);</ins>
8469 <i>Requires:</i> Those signatures taking a <tt>const
8470 value_type&</tt> parameter requires the <tt>value_type</tt> to
8471 be <tt>CopyConstructible</tt>.
8475 The signature taking <tt>InputIterator</tt> parameters requires
8476 <tt>CopyConstructible</tt> of <tt>value_type</tt> if the dereferenced
8477 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
8478 <tt>value_type</tt>.
8486 Add to 23.4.4.2 [unord.multiset.swap]:
8490 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
8491 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
8492 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
8493 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8494 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
8495 unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);</ins>
8496 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
8497 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x,
8498 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);</ins>
8505 Voted to WP in Bellevue.
8510 post Bellevue, Pete notes:
8516 Please remind people who are reviewing issues to check that the text
8517 modifications match the current draft. Issue 676, for example, adds two
8518 overloads for unordered_map::insert taking a hint. One takes a
8519 const_iterator and returns a const_iterator, and the other takes an
8520 iterator and returns an iterator. This was correct at the time the issue
8521 was written, but was changed in Toronto so there is only one hint
8522 overload, taking a const_iterator and returning an iterator.
8525 This issue is not ready. In addition to the relatively minor signature
8526 problem I mentioned earlier, it puts requirements in the wrong places.
8527 Instead of duplicating requirements throughout the template
8528 specifications, it should put them in the front matter that talks about
8529 requirements for unordered containers in general. This presentation
8530 problem is editorial, but I'm not willing to do the extensive rewrite
8531 that it requires. Please put it back into Open status.
8539 <h3><a name="688"></a>688. reference_wrapper, cref unsafe, allow binding to rvalues</h3>
8540 <p><b>Section:</b> 20.6.5.1 [refwrap.const] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
8541 <b>Submitter:</b> Peter Dimov <b>Date:</b> 2007-05-10</p>
8542 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#refwrap.const">issues</a> in [refwrap.const].</p>
8543 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
8544 <p><b>Discussion:</b></p>
8546 A <tt>reference_wrapper</tt> can be constructed from an rvalue, either by using
8547 the constructor, or via <tt>cref</tt> (and <tt>ref</tt> in some corner cases). This leads
8548 to a dangling reference being stored into the <tt>reference_wrapper</tt> object.
8549 Now that we have a mechanism to detect an rvalue, we can fix them to
8550 disallow this source of undefined behavior.
8554 Also please see the thread starting at c++std-lib-17398 for some good discussion on this subject.
8559 <p><b>Proposed resolution:</b></p>
8561 In 20.6 [function.objects], add the following two signatures to the synopsis:
8564 <blockquote><pre>template <class T> void ref(const T&& t) = delete;
8565 template <class T> void cref(const T&& t) = delete;
8571 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2292.html">N2292</a>
8572 addresses the first part of the resolution but not the second.
8577 Bellevue: Doug noticed problems with the current wording.
8582 post Bellevue: Howard and Peter provided revised wording.
8587 This resolution depends on a "favorable" resolution of CWG 606: that is,
8588 the "special deduction rule" is disabled with the const T&& pattern.
8596 <h3><a name="691"></a>691. const_local_iterator cbegin, cend missing from TR1</h3>
8597 <p><b>Section:</b> 23.4 [unord], TR1 6.3 [tr.hash] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
8598 <b>Submitter:</b> JoaquÃn M López Muñoz <b>Date:</b> 2007-06-14</p>
8599 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unord">active issues</a> in [unord].</p>
8600 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unord">issues</a> in [unord].</p>
8601 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
8602 <p><b>Discussion:</b></p>
8604 The last version of TR1 does not include the following member
8606 for unordered containers:
8609 <blockquote><pre>const_local_iterator cbegin(size_type n) const;
8610 const_local_iterator cend(size_type n) const;
8614 which looks like an oversight to me. I've checked th TR1 issues lists
8615 and the latest working draft of the C++0x std (N2284) and haven't
8616 found any mention to these menfuns or to their absence.
8619 Is this really an oversight, or am I missing something?
8624 <p><b>Proposed resolution:</b></p>
8626 Add the following two rows to table 93 (unordered associative container
8627 requirements) in section 23.1.5 [unord.req]:
8632 <caption>Unordered associative container requirements (in addition to container)</caption>
8634 <th>expression</th> <th>return type</th> <th>assertion/note pre/post-condition</th> <th>complexity</th>
8637 <td><ins><tt>b.cbegin(n)</tt></ins></td> <td><ins><tt>const_local_iterator</tt></ins></td> <td><ins><tt>n</tt> shall be in the range <tt>[0, bucket_count())</tt>. Note: <tt>[b.cbegin(n), b.cend(n))</tt> is a valid range containing all of the elements in the <tt>n</tt><sup><i>th</i></sup> bucket.</ins></td> <td><ins>Constant</ins></td>
8640 <td><ins><tt>b.cend(n)</tt></ins></td> <td><ins><tt>const_local_iterator</tt></ins></td> <td><ins><tt>n</tt> shall be in the range <tt>[0, bucket_count())</tt>.</ins></td> <td><ins>Constant</ins></td>
8646 Add to the synopsis in 23.4.1 [unord.map]:
8649 <blockquote><pre><ins>const_local_iterator cbegin(size_type n) const;
8650 const_local_iterator cend(size_type n) const;</ins>
8654 Add to the synopsis in 23.4.2 [unord.multimap]:
8657 <blockquote><pre><ins>const_local_iterator cbegin(size_type n) const;
8658 const_local_iterator cend(size_type n) const;</ins>
8662 Add to the synopsis in 23.4.3 [unord.set]:
8665 <blockquote><pre><ins>const_local_iterator cbegin(size_type n) const;
8666 const_local_iterator cend(size_type n) const;</ins>
8670 Add to the synopsis in 23.4.4 [unord.multiset]:
8673 <blockquote><pre><ins>const_local_iterator cbegin(size_type n) const;
8674 const_local_iterator cend(size_type n) const;</ins>
8683 <h3><a name="692"></a>692. <code>get_money</code> and <code>put_money</code> should be formatted I/O functions</h3>
8684 <p><b>Section:</b> 27.6.4 [ext.manip] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
8685 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2007-06-22</p>
8686 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#ext.manip">active issues</a> in [ext.manip].</p>
8687 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ext.manip">issues</a> in [ext.manip].</p>
8688 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
8689 <p><b>Discussion:</b></p>
8691 In a private email Bill Plauger notes:
8694 I believe that the function that implements <code>get_money</code>
8695 [from <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2072.html">N2072</a>]
8696 should behave as a formatted input function, and the function that
8697 implements <code>put_money</code> should behave as a formatted output
8698 function. This has implications regarding the skipping of whitespace
8699 and the handling of errors, among other things.
8702 The words don't say that right now and I'm far from convinced that
8703 such a change is editorial.
8709 I agree that the manipulators should handle exceptions the same way as
8710 formatted I/O functions do. The text in N2072 assumes so but the
8711 <i>Returns</i> clause explicitly omits exception handling for the sake
8712 of brevity. The spec should be clarified to that effect.
8715 As for dealing with whitespace, I also agree it would make sense for
8716 the extractors and inserters involving the new manipulators to treat
8717 it the same way as formatted I/O.
8721 <p><b>Proposed resolution:</b></p>
8723 Add a new paragraph immediately above p4 of 27.6.4 [ext.manip] with the
8727 <i>Effects</i>: The expression <code><i>in</i> >> get_money(mon, intl)</code>
8728 described below behaves as a formatted input function (as
8729 described in 27.6.1.2.1 [istream.formatted.reqmts]).
8732 Also change p4 of 27.6.4 [ext.manip] as follows:
8735 <i>Returns</i>: An object <code>s</code> of unspecified type such that
8736 if <code>in</code> is an object of type <code>basic_istream<charT,
8737 traits></code> then the expression <code><i>in</i> >> get_money(mon, intl)</code> behaves as <ins>a formatted input function
8738 that calls </ins><code>f(in, mon, intl)</code><del> were
8739 called</del>. The function <code>f</code> can be defined as...
8749 We recommend moving immediately to Review. We've looked at the issue and
8750 have a consensus that the proposed resolution is correct, but want an
8751 iostream expert to sign off. Alisdair has taken the action item to putt
8752 this up on the reflector for possible movement by Howard to Tenatively
8760 <h3><a name="696"></a>696. <code>istream::operator>>(int&)</code> broken</h3>
8761 <p><b>Section:</b> 27.6.1.2.2 [istream.formatted.arithmetic] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
8762 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2007-06-23</p>
8763 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#istream.formatted.arithmetic">issues</a> in [istream.formatted.arithmetic].</p>
8764 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
8765 <p><b>Discussion:</b></p>
8767 From message c++std-lib-17897:
8770 The code shown in 27.6.1.2.2 [istream.formatted.arithmetic] as the "as if"
8771 implementation of the two arithmetic extractors that don't have a
8772 corresponding <code>num_get</code> interface (i.e., the
8773 <code>short</code> and <code>int</code> overloads) is subtly buggy in
8774 how it deals with <code>EOF</code>, overflow, and other similar
8775 conditions (in addition to containing a few typos).
8778 One problem is that if <code>num_get::get()</code> reaches the EOF
8779 after reading in an otherwise valid value that exceeds the limits of
8780 the narrower type (but not <code>LONG_MIN</code> or
8781 <code>LONG_MAX</code>), it will set <code><i>err</i></code> to
8782 <code>eofbit</code>. Because of the if condition testing for
8783 <code>(<i>err</i> == 0)</code>, the extractor won't set
8784 <code>failbit</code> (and presumably, return a bogus value to the
8788 Another problem with the code is that it never actually sets the
8789 argument to the extracted value. It can't happen after the call to
8790 <code>setstate()</code> since the function may throw, so we need to
8791 show when and how it's done (we can't just punt as say: "it happens
8792 afterwards"). However, it turns out that showing how it's done isn't
8793 quite so easy since the argument is normally left unchanged by the
8794 facet on error except when the error is due to a misplaced thousands
8795 separator, which causes <code>failbit</code> to be set but doesn't
8796 prevent the facet from storing the value.
8800 <p><b>Proposed resolution:</b></p>
8809 <h3><a name="698"></a>698. <tt>system_error</tt> needs <tt>const char*</tt> constructors</h3>
8810 <p><b>Section:</b> 19.4.5.1 [syserr.syserr.overview] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
8811 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2007-06-24</p>
8812 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
8813 <p><b>Discussion:</b></p>
8815 In 19.4.5.1 [syserr.syserr.overview] we have the class definition of
8816 <tt>std::system_error</tt>. In contrast to all exception classes, which
8817 are constructible with a <tt>what_arg string</tt> (see 19.1 [std.exceptions],
8818 or <tt>ios_base::failure</tt> in 27.4.2.1.1 [ios::failure]), only overloads with with
8819 <tt>const string&</tt> are possible. For consistency with the re-designed
8820 remaining exception classes this class should also provide
8821 c'tors which accept a const <tt>char* what_arg</tt> string.
8824 Please note that this proposed addition makes sense even
8825 considering the given implementation hint for <tt>what()</tt>, because
8826 <tt>what_arg</tt> is required to be set as <tt>what_arg</tt> of the base class
8827 <tt>runtime_error</tt>, which now has the additional c'tor overload
8828 accepting a <tt>const char*</tt>.
8832 <p><b>Proposed resolution:</b></p>
8834 This proposed wording assumes issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#832">832</a> has been accepted and applied to the working paper.
8838 Change 19.4.5.1 [syserr.syserr.overview] Class system_error overview, as indicated:
8841 <blockquote><pre>public:
8842 system_error(error_code ec, const string& what_arg);
8843 <ins>system_error(error_code ec, const char* what_arg);</ins>
8844 system_error(error_code ec);
8845 system_error(int ev, const error_category* ecat,
8846 const string& what_arg);
8847 <ins>system_error(int ev, const error_category* ecat,
8848 const char* what_arg);</ins>
8849 system_error(int ev, const error_category* ecat);
8853 To 19.4.5.2 [syserr.syserr.members] Class system_error members add:
8857 <pre>system_error(error_code ec, const char* what_arg);
8861 <i>Effects:</i> Constructs an object of class <tt>system_error</tt>.
8864 <i>Postconditions:</i> <tt>code() == ec</tt> and <tt>strcmp(runtime_error::what(), what_arg) == 0</tt>.
8868 <pre>system_error(int ev, const error_category* ecat, const char* what_arg);
8873 <i>Effects:</i> Constructs an object of class <tt>system_error</tt>.
8876 <i>Postconditions:</i> <tt>code() == error_code(ev, ecat)</tt> and <tt>strcmp(runtime_error::what(), what_arg) == 0</tt>.
8887 <h3><a name="701"></a>701. assoc laguerre poly's</h3>
8888 <p><b>Section:</b> TR1 5.2.1.1 [tr.num.sf.Lnm] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
8889 <b>Submitter:</b> Christopher Crawford <b>Date:</b> 2007-06-30</p>
8890 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
8891 <p><b>Discussion:</b></p>
8893 I see that the definition the associated Laguerre
8894 polynomials TR1 5.2.1.1 [tr.num.sf.Lnm] has been corrected since
8895 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1687.pdf">N1687</a>.
8896 However, the draft standard only specifies ranks of integer value <tt>m</tt>,
8897 while the associated Laguerre polynomials are actually valid for real
8898 values of <tt>m > -1</tt>. In the case of non-integer values of <tt>m</tt>, the
8899 definition <tt><i>L</i><sub>n</sub><sup>(m)</sup> = (1/n!)e<sup>x</sup>x<sup>-m</sup> (d/dx)<sup>n</sup> (e<sup>-x</sup>x<sup>m+n</sup>)</tt>
8900 must be used, which also holds for integer values of <tt>m</tt>. See
8901 Abramowitz & Stegun, 22.11.6 for the general case, and 22.5.16-17 for
8902 the integer case. In fact fractional values are most commonly used in
8903 physics, for example to <tt>m = +/- 1/2</tt> to describe the harmonic
8904 oscillator in 1 dimension, and <tt>1/2, 3/2, 5/2, ...</tt> in 3
8908 If I am correct, the calculation of the more general case is no
8909 more difficult, and is in fact the function implemented in the GNU
8910 Scientific Library. I would urge you to consider upgrading the
8911 standard, either adding extra functions for real <tt>m</tt> or switching the
8912 current ones to <tt>double</tt>.
8916 <p><b>Proposed resolution:</b></p>
8925 <h3><a name="702"></a>702. Restriction in associated Legendre functions</h3>
8926 <p><b>Section:</b> TR1 5.2.1.2 [tr.num.sf.Plm] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
8927 <b>Submitter:</b> Christopher Crawford <b>Date:</b> 2007-06-30</p>
8928 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
8929 <p><b>Discussion:</b></p>
8931 One other small thing, in TR1 5.2.1.2 [tr.num.sf.Plm], the restriction should be
8932 <tt>|x| <= 1</tt>, not <tt>x >= 0</tt>.</p>
8935 <p><b>Proposed resolution:</b></p>
8944 <h3><a name="704"></a>704. MoveAssignable requirement for container value type overly strict</h3>
8945 <p><b>Section:</b> 23.1 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
8946 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2007-05-20</p>
8947 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements">active issues</a> in [container.requirements].</p>
8948 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements">issues</a> in [container.requirements].</p>
8949 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
8950 <p><b>Discussion:</b></p>
8952 The move-related changes inadvertently overwrote the intent of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#276">276</a>.
8953 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#276">276</a> removed the requirement of <tt>CopyAssignable</tt> from
8954 most of the member functions of node-based containers. But the move-related changes
8955 unnecessarily introduced the <tt>MoveAssignable</tt> requirement for those members which used to
8956 require <tt>CopyAssignable</tt>.
8960 We also discussed (c++std-lib-18722) the possibility of dropping <tt>MoveAssignable</tt>
8961 from some of the sequence requirements. Additionally the <i>in-place</i> construction
8962 work may further reduce requirements. For purposes of an easy reference, here are the
8963 minimum sequence requirements as I currently understand them. Those items in requirements
8964 table in the working draft which do not appear below have been purposefully omitted for
8965 brevity as they do not have any requirements of this nature. Some items which do not
8966 have any requirements of this nature are included below just to confirm that they were
8967 not omitted by mistake.
8971 <caption>Container Requirements</caption>
8972 <tbody><tr><td><tt>X u(a)</tt></td><td><tt>value_type</tt> must be <tt>CopyConstructible</tt></td></tr>
8973 <tr><td><tt>X u(rv)</tt></td><td><tt>array</tt> and containers with a <tt>propagate_never</tt> allocator require <tt>value_type</tt> to be <tt>MoveConstructible</tt></td></tr>
8974 <tr><td><tt>a = u</tt></td><td>Sequences require <tt>value_type</tt> to be <tt>CopyConstructible</tt> and <tt>CopyAssignable</tt>.
8975 Associative containers require <tt>value_type</tt> to be <tt>CopyConstructible</tt>.</td></tr>
8976 <tr><td><tt>a = rv</tt></td><td><tt>array</tt> requires <tt>value_type</tt> to be <tt>MoveAssignable</tt>.
8977 Sequences and Associative containers with <tt>propagate_never</tt> and <tt>propagate_on_copy_construction</tt> allocators require <tt>value_type</tt> to be <tt>MoveConstructible</tt>.</td></tr>
8978 <tr><td><tt>swap(a,u)</tt></td><td><tt>array</tt> and containers with <tt>propagate_never</tt> and
8979 <tt>propagate_on_copy_construction</tt> allocators require <tt>value_type</tt> to be <tt>Swappable</tt>.</td></tr>
8986 <caption>Sequence Requirements</caption>
8987 <tbody><tr><td><tt>X(n)</tt></td><td><tt>value_type</tt> must be <tt>DefaultConstructible</tt></td></tr>
8988 <tr><td><tt>X(n, t)</tt></td><td><tt>value_type</tt> must be <tt>CopyConstructible</tt></td></tr>
8989 <tr><td><tt>X(i, j)</tt></td><td>If the iterators return an lvalue the <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
8990 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
8991 <tr><td><tt>a.insert(p, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
8992 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>CopyAssignable</tt>.</td></tr>
8993 <tr><td><tt>a.insert(p, rv)</tt></td><td>The <tt>value_type</tt> must be <tt>MoveConstructible</tt>.
8994 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>MoveAssignable</tt>.</td></tr>
8995 <tr><td><tt>a.insert(p, n, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
8996 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>CopyAssignable</tt>.</td></tr>
8997 <tr><td><tt>a.insert(p, i, j)</tt></td><td>If the iterators return an lvalue the <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
8998 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>CopyAssignable</tt> when the iterators return an lvalue.
8999 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.
9000 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>MoveAssignable</tt> when the iterators return an rvalue.</td></tr>
9001 <tr><td><tt>a.erase(p)</tt></td><td>The sequences <tt>vector</tt> and <tt>deque</tt> require the <tt>value_type</tt> to be <tt>MoveAssignable</tt>.</td></tr>
9002 <tr><td><tt>a.erase(q1, q2)</tt></td><td>The sequences <tt>vector</tt> and <tt>deque</tt> require the <tt>value_type</tt> to be <tt>MoveAssignable</tt>.</td></tr>
9003 <tr><td><tt>a.clear()</tt></td><td></td></tr>
9004 <tr><td><tt>a.assign(i, j)</tt></td><td>If the iterators return an lvalue the <tt>value_type</tt> must be <tt>CopyConstructible</tt> and <tt>CopyAssignable</tt>.
9005 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt> and <tt>MoveAssignable</tt>.</td></tr>
9006 <tr><td><tt>a.assign(n, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt> and <tt>CopyAssignable</tt>.</td></tr>
9007 <tr><td><tt>a.resize(n)</tt></td><td>The <tt>value_type</tt> must be <tt>DefaultConstructible</tt>.
9008 The sequence <tt>vector</tt> also requires the <tt>value_type</tt> to be <tt>MoveConstructible</tt>.</td></tr>
9009 <tr><td><tt>a.resize(n, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9016 <caption>Optional Sequence Requirements</caption>
9017 <tbody><tr><td><tt>a.front()</tt></td><td></td></tr>
9018 <tr><td><tt>a.back()</tt></td><td></td></tr>
9019 <tr><td><tt>a.push_front(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9020 <tr><td><tt>a.push_front(rv)</tt></td><td>The <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
9021 <tr><td><tt>a.push_back(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9022 <tr><td><tt>a.push_back(rv)</tt></td><td>The <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
9023 <tr><td><tt>a.pop_front()</tt></td><td></td></tr>
9024 <tr><td><tt>a.pop_back()</tt></td><td></td></tr>
9025 <tr><td><tt>a[n]</tt></td><td></td></tr>
9026 <tr><td><tt>a.at[n]</tt></td><td></td></tr>
9033 <caption>Associative Container Requirements</caption>
9034 <tbody><tr><td><tt>X(i, j)</tt></td><td>If the iterators return an lvalue the <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
9035 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
9036 <tr><td><tt>a_uniq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9037 <tr><td><tt>a_uniq.insert(rv)</tt></td><td>The <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>.</td></tr>
9038 <tr><td><tt>a_eq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9039 <tr><td><tt>a_eq.insert(rv)</tt></td><td>The <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>.</td></tr>
9040 <tr><td><tt>a.insert(p, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9041 <tr><td><tt>a.insert(p, rv)</tt></td><td>The <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>.</td></tr>
9042 <tr><td><tt>a.insert(i, j)</tt></td><td>If the iterators return an lvalue the <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
9043 If the iterators return an rvalue the <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>..</td></tr>
9050 <caption>Unordered Associative Container Requirements</caption>
9051 <tbody><tr><td><tt>X(i, j, n, hf, eq)</tt></td><td>If the iterators return an lvalue the <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
9052 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
9053 <tr><td><tt>a_uniq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9054 <tr><td><tt>a_uniq.insert(rv)</tt></td><td>The <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>.</td></tr>
9055 <tr><td><tt>a_eq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9056 <tr><td><tt>a_eq.insert(rv)</tt></td><td>The <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>.</td></tr>
9057 <tr><td><tt>a.insert(p, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
9058 <tr><td><tt>a.insert(p, rv)</tt></td><td>The <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>.</td></tr>
9059 <tr><td><tt>a.insert(i, j)</tt></td><td>If the iterators return an lvalue the <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
9060 If the iterators return an rvalue the <tt>key_type</tt> and the <tt>mapped_type</tt> (if it exists) must be <tt>MoveConstructible</tt>..</td></tr>
9067 <caption>Miscellaneous Requirements</caption>
9068 <tbody><tr><td><tt>map[lvalue-key]</tt></td><td>The <tt>key_type</tt> must be <tt>CopyConstructible</tt>.
9069 The <tt>mapped_type</tt> must be <tt>DefaultConstructible</tt> and <tt>MoveConstructible</tt>.</td></tr>
9070 <tr><td><tt>map[rvalue-key]</tt></td><td>The <tt>key_type</tt> must be <tt>MoveConstructible</tt>.
9071 The <tt>mapped_type</tt> must be <tt>DefaultConstructible</tt> and <tt>MoveConstructible</tt>.</td></tr>
9075 Kona (2007): Howard and Alan to update requirements table in issue with emplace signatures.
9080 Bellevue: This should be handled as part of the concepts work.
9086 <p><b>Proposed resolution:</b></p>
9094 <h3><a name="708"></a>708. Locales need to be per thread and updated for POSIX changes</h3>
9095 <p><b>Section:</b> 22 [localization] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9096 <b>Submitter:</b> Peter Dimov <b>Date:</b> 2007-07-28</p>
9097 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#localization">issues</a> in [localization].</p>
9098 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
9099 <p><b>Discussion:</b></p>
9101 The POSIX "Extended API Set Part 4,"
9104 <a href="http://www.opengroup.org/sib/details.tpl?id=C065">http://www.opengroup.org/sib/details.tpl?id=C065</a>
9107 introduces extensions to the C locale mechanism that
9108 allow multiple concurrent locales to be used in the same application
9109 by introducing a type <tt>locale_t</tt> that is very similar to
9110 <tt>std::locale</tt>, and a number of <tt>_l</tt> functions that make use of it.
9113 The global locale (set by setlocale) is now specified to be per-
9114 process. If a thread does not call <tt>uselocale</tt>, the global locale is
9115 in effect for that thread. It can install a per-thread locale by
9116 using <tt>uselocale</tt>.
9119 There is also a nice <tt>querylocale</tt> mechanism by which one can obtain
9120 the name (such as "de_DE") for a specific <tt>facet</tt>, even for combined
9121 locales, with no <tt>std::locale</tt> equivalent.
9124 <tt>std::locale</tt> should be harmonized with the new POSIX <tt>locale_t</tt>
9125 mechanism and provide equivalents for <tt>uselocale</tt> and <tt>querylocale</tt>.
9129 Kona (2007): Bill and Nick to provide wording.
9135 <p><b>Proposed resolution:</b></p>
9144 <h3><a name="709"></a>709. <tt>char_traits::not_eof</tt> has wrong signature</h3>
9145 <p><b>Section:</b> 21.1.3 [char.traits.specializations] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
9146 <b>Submitter:</b> Bo Persson <b>Date:</b> 2007-08-13</p>
9147 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#char.traits.specializations">issues</a> in [char.traits.specializations].</p>
9148 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
9149 <p><b>Discussion:</b></p>
9151 The changes made for <tt>constexpr</tt> in 21.1.3 [char.traits.specializations] have
9152 not only changed the <tt>not_eof</tt> function from pass by const reference to
9153 pass by value, it has also changed the parameter type from <tt>int_type</tt> to
9157 This doesn't work for type <tt>char</tt>, and is inconsistent with the
9158 requirements in Table 56, Traits requirements, 21.1.1 [char.traits.require].
9166 For what it's worth, that may not have been an intentional change.
9167 N2349, which detailed the changes for adding constant expressions to
9168 the library, has strikeout bars through the <tt>const</tt> and the <tt>&</tt> that
9169 surround the <tt>char_type</tt> argument, but none through <tt>char_type</tt> itself.
9170 So the intention may have been just to change to pass by value, with
9171 text incorrectly copied from the standard.
9176 <p><b>Proposed resolution:</b></p>
9178 Change the signature in 21.1.3.1 [char.traits.specializations.char],
9179 21.1.3.2 [char.traits.specializations.char16_t], 21.1.3.3 [char.traits.specializations.char32_t],
9180 and 21.1.3.4 [char.traits.specializations.wchar.t] to
9183 <blockquote><pre>static constexpr int_type not_eof(<del>char_type</del> <ins>int_type</ins> c);
9194 Resolution: NAD editorial - up to Pete's judgment
9198 Post Sophia Antipolis
9203 Moved from Pending NAD Editorial to Review. The proposed wording appears to be correct but non-editorial.
9210 <h3><a name="711"></a>711. Contradiction in empty <tt>shared_ptr</tt></h3>
9211 <p><b>Section:</b> 20.7.12.2.5 [util.smartptr.shared.obs] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9212 <b>Submitter:</b> Peter Dimov <b>Date:</b> 2007-08-24</p>
9213 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#util.smartptr.shared.obs">issues</a> in [util.smartptr.shared.obs].</p>
9214 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
9215 <p><b>Discussion:</b></p>
9218 <a href="http://groups.google.com/group/comp.std.c++/browse_frm/thread/8e89dceb35cd7971">comp.std.c++</a>
9219 has identified a contradiction in the <tt>shared_ptr</tt> specification.
9224 [ <i>Note:</i> this constructor allows creation of an empty shared_ptr instance with a non-NULL stored pointer.
9229 after the aliasing constructor
9232 <blockquote><pre>template<class Y> shared_ptr(shared_ptr<Y> const& r, T *p);
9236 reflects the intent of
9237 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2351.htm">N2351</a>
9238 to, well, allow the creation of an empty <tt>shared_ptr</tt>
9239 with a non-NULL stored pointer.
9243 This is contradicted by the second sentence in the Returns clause of 20.7.12.2.5 [util.smartptr.shared.obs]:
9247 <pre>T* get() const;
9250 <i>Returns:</i> the stored pointer. Returns a null pointer if <tt>*this</tt> is empty.
9261 Adopt option 1 and move to review, not ready.
9264 There was a lot of confusion about what an empty <tt>shared_ptr</tt> is (the term
9265 isn't defined anywhere), and whether we have a good mental model for how
9266 one behaves. We think it might be possible to deduce what the definition
9267 should be, but the words just aren't there. We need to open an issue on
9268 the use of this undefined term. (The resolution of that issue might
9269 affect the resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#711">711</a>.)
9272 The LWG is getting more uncomfortable with the aliasing proposal (N2351)
9273 now that we realize some of its implications, and we need to keep an eye
9274 on it, but there isn't support for removing this feature at this time.
9285 We heard from Peter Dimov, who explained his reason for preferring solution 1.
9288 Because it doesn't seem to add anything. It simply makes the behavior
9289 for p = 0 undefined. For programmers who don't create empty pointers
9290 with p = 0, there is no difference. Those who do insist on creating them
9291 presumably have a good reason, and it costs nothing for us to define the
9292 behavior in this case.
9295 The aliasing constructor is sharp enough as it is, so "protecting" users
9296 doesn't make much sense in this particular case.
9299 > Do you have a use case for r being empty and r being non-null?
9302 I have received a few requests for it from "performance-conscious"
9303 people (you should be familiar with this mindset) who don't like the
9304 overhead of allocating and maintaining a control block when a null
9305 deleter is used to approximate a raw pointer. It is obviously an "at
9306 your own risk", low-level feature; essentially a raw pointer behind a
9310 We could not agree upon a resolution to the issue; some of us thought
9311 that Peter's description above is supporting an undesirable behavior.
9317 <p><b>Proposed resolution:</b></p>
9319 In keeping the N2351 spirit and obviously my preference, change 20.7.12.2.5 [util.smartptr.shared.obs]:
9323 <pre>T* get() const;
9326 <i>Returns:</i> the stored pointer. <del>Returns a null pointer if <tt>*this</tt> is empty.</del>
9331 Alternative proposed resolution: (I won't be happy if we do this, but it's possible):
9335 Change 20.7.12.2.1 [util.smartptr.shared.const]:
9339 <pre>template<class Y> shared_ptr(shared_ptr<Y> const& r, T *p);
9343 <ins><i>Requires:</i> If <tt>r</tt> is empty, <tt>p</tt> shall be <tt>0</tt>.</ins>
9346 <del>[ <i>Note:</i> this constructor allows creation of an empty <tt>shared_ptr</tt>
9347 instance with a non-NULL stored pointer.
9348 -- <i>end note</i> ]</del>
9359 <h3><a name="713"></a>713. <tt>sort()</tt> complexity is too lax</h3>
9360 <p><b>Section:</b> 25.3.1.1 [sort] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
9361 <b>Submitter:</b> Matt Austern <b>Date:</b> 2007-08-30</p>
9362 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
9363 <p><b>Discussion:</b></p>
9365 The complexity of <tt>sort()</tt> is specified as "Approximately <tt>N
9366 log(N)</tt> (where <tt>N == last - first</tt> ) comparisons on the
9367 average", with no worst case complicity specified. The intention was to
9368 allow a median-of-three quicksort implementation, which is usually <tt>O(N
9369 log N)</tt> but can be quadratic for pathological inputs. However, there is
9370 no longer any reason to allow implementers the freedom to have a
9371 worst-cast-quadratic sort algorithm. Implementers who want to use
9372 quicksort can use a variant like David Musser's "Introsort" (Software
9373 Practice and Experience 27:983-993, 1997), which is guaranteed to be <tt>O(N
9374 log N)</tt> in the worst case without incurring additional overhead in the
9375 average case. Most C++ library implementers already do this, and there
9376 is no reason not to guarantee it in the standard.
9380 <p><b>Proposed resolution:</b></p>
9382 In 25.3.1.1 [sort], change the complexity to "O(N log N)", and remove footnote 266:
9387 <i>Complexity:</i> <del>Approximately</del> <ins>O(</ins><i>N</i> log(<i>N</i>)<ins>)</ins> (where <i>N</i> == <i>last</i> - <i>first</i> )
9388 comparisons<del> on the average</del>.<del><sup>266)</sup></del>
9391 <del><sup>266)</sup>
9392 If the worst case behavior is important <tt>stable_sort()</tt> (25.3.1.2) or <tt>partial_sort()</tt>
9393 (25.3.1.3) should be used.</del>
9403 <h3><a name="714"></a>714. <tt>search_n</tt> complexity is too lax</h3>
9404 <p><b>Section:</b> 25.1.12 [alg.search] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
9405 <b>Submitter:</b> Matt Austern <b>Date:</b> 2007-08-30</p>
9406 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#alg.search">issues</a> in [alg.search].</p>
9407 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
9408 <p><b>Discussion:</b></p>
9410 The complexity for <tt>search_n</tt> (25.1.12 [alg.search] par 7) is specified as "At most
9411 (last - first ) * count applications of the corresponding predicate if
9412 count is positive, or 0 otherwise." This is unnecessarily pessimistic.
9413 Regardless of the value of count, there is no reason to examine any
9414 element in the range more than once.
9418 <p><b>Proposed resolution:</b></p>
9420 Change the complexity to "At most (last - first) applications of the corresponding predicate".
9424 <pre>template<class ForwardIterator, class Size, class T>
9426 search_n(ForwardIterator first , ForwardIterator last , Size count ,
9427 const T& value );
9429 template<class ForwardIterator, class Size, class T,
9430 class BinaryPredicate>
9432 search_n(ForwardIterator first , ForwardIterator last , Size count ,
9433 const T& value , BinaryPredicate pred );
9437 <i>Complexity:</i> At most <tt>(last - first ) <del>* count</del></tt> applications of the corresponding predicate
9438 <del>if <tt>count</tt> is positive, or 0 otherwise</del>.
9449 <h3><a name="716"></a>716. Production in [re.grammar] not actually modified</h3>
9450 <p><b>Section:</b> 28.13 [re.grammar] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
9451 <b>Submitter:</b> Stephan T. Lavavej <b>Date:</b> 2007-08-31</p>
9452 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
9453 <p><b>Discussion:</b></p>
9455 TR1 7.13 [tr.re.grammar]/3 and C++0x WP 28.13 [re.grammar]/3 say:
9460 The following productions within the ECMAScript grammar are modified as follows:
9463 <blockquote><pre>CharacterClass ::
9464 [ [lookahead ∉ {^}] ClassRanges ]
9471 This definition for <tt>CharacterClass</tt> appears to be exactly identical to that in ECMA-262.
9475 Was an actual modification intended here and accidentally omitted, or was this production accidentally included?
9479 <p><b>Proposed resolution:</b></p>
9481 Remove this mention of the CharacterClass production.
9484 <blockquote><pre><del>CharacterClass ::
9485 [ [lookahead ∉ {^}] ClassRanges ]
9486 [ ^ ClassRanges ]</del>
9495 <h3><a name="718"></a>718. <tt>basic_string</tt> is not a sequence</h3>
9496 <p><b>Section:</b> 21.3 [basic.string] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9497 <b>Submitter:</b> Bo Persson <b>Date:</b> 2007-08-18</p>
9498 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#basic.string">active issues</a> in [basic.string].</p>
9499 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#basic.string">issues</a> in [basic.string].</p>
9500 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
9501 <p><b>Discussion:</b></p>
9503 Paragraph 21.3 [basic.string]/3 states:
9508 The class template <tt>basic_string</tt> conforms to the requirements for a
9509 Sequence (23.1.1) and for a Reversible Container (23.1).
9514 First of all, 23.1.3 [sequence.reqmts] is no longer "Sequence" but "Sequence container".
9515 Secondly, after the resent changes to containers (<tt>emplace</tt>, <tt>push_back</tt>,
9516 <tt>const_iterator</tt> parameters to <tt>insert</tt> and <tt>erase</tt>), <tt>basic_string</tt> is not
9517 even close to conform to the current requirements.
9527 <li>emplace, for example, may not make sense for strings. Is also likely suboptimal</li>
9528 <li>with concepts do we need to maintain string as sequence container?</li>
9529 <li>One approach might be to say something like: string is a sequence except it doesn't have these functions</li>
9532 <li>basic_string already has push_back</li>
9533 <li>const_iterator parameters to insert and erase should be added to basic_string</li>
9534 <li>this leaves emplace to handle -- we have the following options:
9536 <li>option 1: add it to string even though it's optional</li>
9537 <li>option 2: make emplace optional to sequences (move from table 89 to 90)</li>
9538 <li>option 3: say string not sequence (the proposal),</li>
9539 <li>option 4: add an exception to basic string wording.</li>
9543 General consensus is to suggest option 2.
9548 <p><b>Proposed resolution:</b></p>
9550 Remove this sentence, in recognition of the fact that <tt>basic_string</tt> is
9551 not just a <tt>vector</tt>-light for literal types, but something quite
9552 different, a string abstraction in its own right.
9560 <h3><a name="719"></a>719. <tt>std::is_literal</tt> type traits should be provided</h3>
9561 <p><b>Section:</b> 20.5 [meta] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9562 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2007-08-25</p>
9563 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#meta">issues</a> in [meta].</p>
9564 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
9565 <p><b>Discussion:</b></p>
9567 Since the inclusion of <tt>constexpr</tt> in the standard draft N2369 we have
9568 a new type category "literal", which is defined in 3.9 [basic.types]/p.11:
9573 -11- A type is a <i>literal</i> type if it is:
9576 <li>a scalar type; or</li>
9577 <li><p>a class type (clause 9) with</p>
9579 <li>a trivial copy constructor,</li>
9580 <li>a trivial destructor,</li>
9581 <li>at least one constexpr constructor other than the copy constructor,</li>
9582 <li>no virtual base classes, and</li>
9583 <li>all non-static data members and base classes of literal types; or</li>
9586 <li>an array of literal type.</li>
9591 I strongly suggest that the standard provides a type traits for
9592 literal types in 20.5.4.3 [meta.unary.prop] for several reasons:
9596 <li>To keep the traits in sync with existing types.</li>
9597 <li>I see many reasons for programmers to use this trait in template
9598 code to provide optimized template definitions for these types,
9600 <li>A user-provided definition of this trait is practically impossible
9601 to write portably.</li>
9605 The special problem of reason (c) is that I don't see currently a
9606 way to portably test the condition for literal class types:
9611 <li>at least one constexpr constructor other than the copy constructor,</li>
9616 Here follows a simply example to demonstrate it's usefulness:
9619 <blockquote><pre>template <typename T>
9620 constexpr typename std::enable_if<std::is_literal<T>::value, T>::type
9622 return x < T() ? -x : x;
9625 template <typename T>
9626 typename std::enable_if<!std::is_literal<T>::value, T>::type
9627 abs(const T& x) {
9628 return x < T() ? -x : x;
9633 Here we have the possibility to provide a general <tt>abs</tt> function
9634 template that can be used in ICE's if it's argument is a literal
9635 type which's value is a constant expression, otherwise we
9636 have an optimized version for arguments which are expensive
9637 to copy and therefore need the usage of arguments of
9638 reference type (instead of <tt>const T&</tt> we could decide to
9639 use <tt>T&&</tt>, but that is another issue).
9643 Alisdair is considering preparing a paper listing a number of missing
9644 type traits, and feels that it might be useful to handle them all
9645 together rather than piecemeal. This would affect issue 719 and 750.
9646 These two issues should move to OPEN pending AM paper on type traits.
9652 <p><b>Proposed resolution:</b></p>
9654 In 20.5.2 [meta.type.synop] in the group "type properties",
9658 <blockquote><pre>template <class T> struct is_pod;
9665 <blockquote><pre>template <class T> struct is_literal;
9669 In 20.5.4.3 [meta.unary.prop], table Type Property Predicates, just
9670 below the line for the <tt>is_pod</tt> property add a new line:
9675 <th>Template</th><th>Condition</th><th>Preconditions</th>
9678 <td><tt>template <class T> struct is_literal;</tt></td>
9679 <td><tt>T</tt> is a literal type (3.9)</td>
9680 <td><tt>T</tt> shall be a complete type, an
9681 array of unknown bound, or
9682 (possibly cv-qualified) <tt>void</tt>.</td>
9692 <h3><a name="720"></a>720. Omissions in constexpr usages</h3>
9693 <p><b>Section:</b> 23.2.1 [array], 23.3.5 [template.bitset] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
9694 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2007-08-25</p>
9695 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#array">active issues</a> in [array].</p>
9696 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#array">issues</a> in [array].</p>
9697 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
9698 <p><b>Discussion:</b></p>
9701 The member function <tt>bool array<T,N>::empty() const</tt> should be a
9702 <tt>constexpr</tt> because this is easily to proof and to implement following it's operational
9703 semantics defined by Table 87 (Container requirements) which says: <tt>a.size() == 0</tt>.
9706 The member function <tt>bool bitset<N>::test() const</tt> must be a
9707 <tt>constexpr</tt> (otherwise it would violate the specification of <tt>constexpr
9708 bitset<N>::operator[](size_t) const</tt>, because it's return clause delegates to <tt>test()</tt>).
9711 I wonder how the constructor <tt>bitset<N>::bitset(unsigned long)</tt> can
9712 be declared as a <tt>constexpr</tt>. Current implementations usually have no such <tt>bitset</tt>
9713 c'tor which would fulfill the requirements of a <tt>constexpr</tt> c'tor because they have a
9714 non-empty c'tor body that typically contains for-loops or <tt>memcpy</tt> to compute the
9715 initialisation. What have I overlooked here?
9726 We handle this as two parts
9730 The proposed resolution is correct; move to ready.
9733 The issue points out a real problem, but the issue is larger than just
9734 this solution. We believe a paper is needed, applying the full new
9735 features of C++ (including extensible literals) to update <tt>std::bitset</tt>.
9736 We note that we do not consider this new work, and that is should be
9737 handled by the Library Working Group.
9741 In order to have a consistent working paper, Alisdair and Daniel produced a new wording for the resolution.
9747 <p><b>Proposed resolution:</b></p>
9750 <p>In the class template definition of 23.2.1 [array]/p. 3 change</p>
9751 <blockquote><pre><ins>constexpr</ins> bool empty() const;
9756 <p>In the class template definition of 23.3.5 [template.bitset]/p. 1 change</p>
9757 <blockquote><pre><ins>constexpr</ins> bool test(size_t pos ) const;
9761 and in 23.3.5.2 [bitset.members] change
9764 <blockquote><pre><ins>constexpr</ins> bool test(size_t pos ) const;
9775 <h3><a name="721"></a>721. <tt>wstring_convert</tt> inconsistensies</h3>
9776 <p><b>Section:</b> 22.1.3.2.2 [conversions.string] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
9777 <b>Submitter:</b> Bo Persson <b>Date:</b> 2007-08-27</p>
9778 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
9779 <p><b>Discussion:</b></p>
9781 Paragraph 3 says that the <tt>Codecvt</tt> template parameter shall meet the
9782 requirements of <tt>std::codecvt</tt>, even though <tt>std::codecvt</tt> itself cannot
9783 be used (because of a protected destructor).
9787 How are we going to explain this code to beginning programmers?
9790 <blockquote><pre>template<class I, class E, class S>
9791 struct codecvt : std::codecvt<I, E, S>
9799 std::wstring_convert<codecvt<wchar_t, char, std::mbstate_t> > compiles_ok;
9801 std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t> > not_ok;
9807 <p><b>Proposed resolution:</b></p>
9816 <h3><a name="723"></a>723. <tt>basic_regex</tt> should be moveable</h3>
9817 <p><b>Section:</b> 28.8 [re.regex] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9818 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2007-08-29</p>
9819 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#re.regex">issues</a> in [re.regex].</p>
9820 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
9821 <p><b>Discussion:</b></p>
9823 According to the current state of the standard draft, the class
9824 template <tt>basic_regex</tt>, as described in 28.8 [re.regex]/3, is
9825 neither <tt>MoveConstructible</tt> nor <tt>MoveAssignable</tt>.
9826 IMO it should be, because typical regex state machines tend
9827 to have a rather large data quantum and I have seen several
9828 use cases, where a factory function returns regex values,
9829 which would take advantage of moveabilities.
9838 Needs wording for the semantics, the idea is agreed upon.
9842 <p><b>Proposed resolution:</b></p>
9846 In the header <tt><regex></tt> synopsis 28.4 [re.syn], just below the function
9847 template <tt>swap</tt> add two further overloads:
9849 <blockquote><pre>template <class charT, class traits>
9850 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
9851 <ins>template <class charT, class traits>
9852 void swap(basic_regex<charT, traits>&& e1, basic_regex<charT, traits>& e2);
9853 template <class charT, class traits>
9854 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>&& e2);</ins>
9857 In the class definition of <tt>basic_regex</tt>, just below 28.8 [re.regex]/3,
9858 perform the following changes:
9863 <p>Just after the copy c'tor:</p>
9864 <blockquote><pre>basic_regex(basic_regex&&);
9869 <p>Just after the copy-assignment op.:</p>
9870 <blockquote><pre>basic_regex& operator=(basic_regex&&);
9875 <p>Just after the first <tt>assign</tt> overload insert:</p>
9876 <blockquote><pre>basic_regex& assign(basic_regex&& that);
9881 <p>Change the current <tt>swap</tt> function to read:</p>
9882 <blockquote><pre>void swap(basic_regex&&);
9887 <p>In 28.8.2 [re.regex.construct], just below the copy c'tor add a
9888 corresponding member definition of:</p>
9889 <blockquote><pre>basic_regex(basic_regex&&);
9894 <p>Also in 28.8.2 [re.regex.construct], just below the copy assignment
9895 c'tor add a corresponding member definition of:</p>
9896 <blockquote><pre>basic_regex& operator=(basic_regex&&);
9901 <p>In 28.8.3 [re.regex.assign], just below the first <tt>assign</tt> overload add
9902 a corresponding member definition of:</p>
9903 <blockquote><pre>basic_regex& assign(basic_regex&& that);
9908 <p>In 28.8.6 [re.regex.swap], change the signature of <tt>swap</tt> to
9910 <blockquote><pre>void swap(basic_regex&& e);
9915 <p>In 28.8.7.1 [re.regex.nmswap], just below the single binary <tt>swap</tt>
9916 function, add the two missing overloads:</p>
9917 <blockquote><pre>template <class charT, class traits>
9918 void swap(basic_regex<charT, traits>&& e1, basic_regex<charT, traits>& e2);
9919 template <class charT, class traits>
9920 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>&& e2);
9926 Of course there would be need of corresponding proper standardese
9927 to describe these additions.
9936 <h3><a name="724"></a>724. <tt>DefaultConstructible</tt> is not defined</h3>
9937 <p><b>Section:</b> 20.1.1 [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9938 <b>Submitter:</b> Pablo Halpern <b>Date:</b> 2007-09-12</p>
9939 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#utility.arg.requirements">active issues</a> in [utility.arg.requirements].</p>
9940 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#utility.arg.requirements">issues</a> in [utility.arg.requirements].</p>
9941 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
9942 <p><b>Discussion:</b></p>
9944 The <tt>DefaultConstructible</tt> requirement is referenced in
9945 several places in the August 2007 working draft
9946 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2369.pdf">N2369</a>,
9947 but is not defined anywhere.
9957 Walking into the default/value-initialization mess...
9960 Why two lines? Because we need both expressions to be valid.
9963 AJM not sure what the phrase "default constructed" means. This is
9964 unfortunate, as the phrase is already used 24 times in the library!
9967 Example: const int would not accept first line, but will accept the second.
9970 This is an issue that must be solved by concepts, but we might need to solve it independantly first.
9973 It seems that the requirements are the syntax in the proposed first
9974 column is valid, but not clear what semantics we need.
9977 A table where there is no post-condition seems odd, but appears to sum up our position best.
9980 At a minimum an object is declared and is destuctible.
9983 Move to open, as no-one happy to produce wording on the fly.
9988 <p><b>Proposed resolution:</b></p>
9990 In section 20.1.1 [utility.arg.requirements], before table 33, add the
9994 <p style="text-align: center;" align="center">Table 33: <tt>DefaultConstructible</tt> requirements</p>
9996 <div align="center">
9998 <table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0">
10000 <td style="border-style: solid none double solid; border-color: navy -moz-use-text-color navy navy; border-width: 1pt medium 1.5pt 1pt; padding: 0in 5.4pt; width: 85.5pt;" valign="top" width="114">
10001 <p style="margin: 0in 0in 0.0001pt; text-align: center;" align="center">expression</p>
10003 <td style="border-style: solid solid double none; border-color: navy navy navy -moz-use-text-color; border-width: 1pt 1pt 1.5pt medium; padding: 0in 5.4pt; width: 243pt;" valign="top" width="324">
10004 <p style="margin: 0in 0in 0.0001pt; text-align: center;" align="center">post-condition</p>
10008 <td style="border-style: none none solid solid; border-color: -moz-use-text-color -moz-use-text-color navy navy; border-width: medium medium 1pt 1pt; padding: 0in 5.4pt; width: 85.5pt;" valign="top" width="114">
10009 <p style="margin: 0in 0in 0.0001pt;"><tt>T
10013 <td style="border-style: none solid solid none; border-color: -moz-use-text-color navy navy -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 243pt;" valign="top" width="324">
10014 <p style="margin: 0in 0in 0.0001pt;"><tt>T</tt>
10015 is <i>default constructed.</i></p>
10028 <h3><a name="726"></a>726. Missing <tt>regex_replace()</tt> overloads</h3>
10029 <p><b>Section:</b> 28.11.4 [re.alg.replace] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10030 <b>Submitter:</b> Stephan T. Lavavej <b>Date:</b> 2007-09-22</p>
10031 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#re.alg.replace">active issues</a> in [re.alg.replace].</p>
10032 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#re.alg.replace">issues</a> in [re.alg.replace].</p>
10033 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
10034 <p><b>Discussion:</b></p>
10036 Two overloads of <tt>regex_replace()</tt> are currently provided:
10039 <blockquote><pre>template <class OutputIterator, class BidirectionalIterator,
10040 class traits, class charT>
10042 regex_replace(OutputIterator out,
10043 BidirectionalIterator first, BidirectionalIterator last,
10044 const basic_regex<charT, traits>& e,
10045 const basic_string<charT>& fmt,
10046 regex_constants::match_flag_type flags =
10047 regex_constants::match_default);
10049 template <class traits, class charT>
10050 basic_string<charT>
10051 regex_replace(const basic_string<charT>& s,
10052 const basic_regex<charT, traits>& e,
10053 const basic_string<charT>& fmt,
10054 regex_constants::match_flag_type flags =
10055 regex_constants::match_default);
10056 </pre></blockquote>
10059 <li>Overloads taking <tt>const charT *</tt> are provided for <tt>regex_match()</tt> and
10060 <tt>regex_search()</tt>, but not <tt>regex_replace()</tt>. This is inconsistent.</li>
10062 <p>The absence of <tt>const charT *</tt> overloads prevents ordinary-looking code from compiling, such as:</p>
10064 <blockquote><pre>const string s("kitten");
10065 const regex r("en");
10066 cout << regex_replace(s, r, "y") << endl;
10067 </pre></blockquote>
10070 The compiler error message will be something like "could not deduce
10071 template argument for 'const std::basic_string<_Elem> &' from 'const
10076 Users expect that anything taking a <tt>basic_string<charT></tt> can also take a
10077 <tt>const charT *</tt>. In their own code, when they write a function taking
10078 <tt>std::string</tt> (or <tt>std::wstring</tt>), they can pass a <tt>const char *</tt> (or <tt>const
10079 wchar_t *</tt>), thanks to <tt>basic_string</tt>'s implicit constructor. Because the
10080 regex algorithms are templated on <tt>charT</tt>, they can't rely on
10081 <tt>basic_string</tt>'s implicit constructor (as the compiler error message
10082 indicates, template argument deduction fails first).
10086 If a user figures out what the compiler error message means, workarounds
10087 are available - but they are all verbose. Explicit template arguments
10088 could be given to <tt>regex_replace()</tt>, allowing <tt>basic_string</tt>'s implicit
10089 constructor to be invoked - but <tt>charT</tt> is the last template argument, not
10090 the first, so this would be extremely verbose. Therefore, constructing
10091 a <tt>basic_string</tt> from each C string is the simplest workaround.
10096 There is an efficiency consideration: constructing <tt>basic_string</tt>s can
10097 impose performance costs that could be avoided by a library
10098 implementation taking C strings and dealing with them directly.
10099 (Currently, for replacement sources, C strings can be converted into
10100 iterator pairs at the cost of verbosity, but for format strings, there
10101 is no way to avoid constructing a <tt>basic_string</tt>.)
10111 We note that Boost already has these overloads. However, the proposed
10112 wording is provided only for 28.11.4 [re.alg.replace]; wording is needed for the synopsis
10113 as well. We also note that this has impact on <tt>match_results::format</tt>,
10114 which may require further overloads.
10119 <p><b>Proposed resolution:</b></p>
10121 Provide additional overloads for <tt>regex_replace()</tt>: one additional
10122 overload of the iterator-based form (taking <tt>const charT* fmt</tt>), and three
10123 additional overloads of the convenience form (one taking <tt>const charT*
10124 str</tt>, another taking <tt>const charT* fmt</tt>, and the third taking both <tt>const
10125 charT* str</tt> and <tt>const charT* fmt</tt>). 28.11.4 [re.alg.replace]:
10129 <pre>template <class OutputIterator, class BidirectionalIterator,
10130 class traits, class charT>
10132 regex_replace(OutputIterator out,
10133 BidirectionalIterator first, BidirectionalIterator last,
10134 const basic_regex<charT, traits>& e,
10135 const basic_string<charT>& fmt,
10136 regex_constants::match_flag_type flags =
10137 regex_constants::match_default);
10139 <ins>template <class OutputIterator, class BidirectionalIterator,
10140 class traits, class charT>
10142 regex_replace(OutputIterator out,
10143 BidirectionalIterator first, BidirectionalIterator last,
10144 const basic_regex<charT, traits>& e,
10146 regex_constants::match_flag_type flags =
10147 regex_constants::match_default);</ins>
10150 <pre>template <class traits, class charT>
10151 basic_string<charT>
10152 regex_replace(const basic_string<charT>& s,
10153 const basic_regex<charT, traits>& e,
10154 const basic_string<charT>& fmt,
10155 regex_constants::match_flag_type flags =
10156 regex_constants::match_default);
10158 <ins>template <class traits, class charT>
10159 basic_string<charT>
10160 regex_replace(const basic_string<charT>& s,
10161 const basic_regex<charT, traits>& e,
10163 regex_constants::match_flag_type flags =
10164 regex_constants::match_default);</ins>
10166 <ins>template <class traits, class charT>
10167 basic_string<charT>
10168 regex_replace(const charT* s,
10169 const basic_regex<charT, traits>& e,
10170 const basic_string<charT>& fmt,
10171 regex_constants::match_flag_type flags =
10172 regex_constants::match_default);</ins>
10174 <ins>template <class traits, class charT>
10175 basic_string<charT>
10176 regex_replace(const charT* s,
10177 const basic_regex<charT, traits>& e,
10179 regex_constants::match_flag_type flags =
10180 regex_constants::match_default);</ins>
10190 <h3><a name="727"></a>727. <tt>regex_replace()</tt> doesn't accept <tt>basic_string</tt>s with custom traits and allocators</h3>
10191 <p><b>Section:</b> 28.11.4 [re.alg.replace] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
10192 <b>Submitter:</b> Stephan T. Lavavej <b>Date:</b> 2007-09-22</p>
10193 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#re.alg.replace">active issues</a> in [re.alg.replace].</p>
10194 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#re.alg.replace">issues</a> in [re.alg.replace].</p>
10195 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
10196 <p><b>Discussion:</b></p>
10198 <tt>regex_match()</tt> and <tt>regex_search()</tt> take <tt>const basic_string<charT, ST,
10199 SA>&</tt>. <tt>regex_replace()</tt> takes <tt>const basic_string<charT>&</tt>. This prevents
10200 <tt>regex_replace()</tt> from accepting <tt>basic_string</tt>s with custom traits and
10205 <p><b>Proposed resolution:</b></p>
10207 Overloads of <tt>regex_replace()</tt> taking <tt>basic_string</tt> should be additionally
10208 templated on <tt>class ST, class SA</tt> and take <tt>const basic_string<charT, ST,
10209 SA>&</tt>. Consistency with <tt>regex_match()</tt> and <tt>regex_search()</tt> would place
10210 <tt>class ST, class SA</tt> as the first template arguments; compatibility with
10211 existing code using TR1 and giving explicit template arguments to
10212 <tt>regex_replace()</tt> would place <tt>class ST, class SA</tt> as the last template
10221 <h3><a name="728"></a>728. Problem in [rand.eng.mers]/6</h3>
10222 <p><b>Section:</b> 26.4.3.2 [rand.eng.mers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
10223 <b>Submitter:</b> Stephan Tolksdorf <b>Date:</b> 2007-09-21</p>
10224 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.eng.mers">issues</a> in [rand.eng.mers].</p>
10225 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
10226 <p><b>Discussion:</b></p>
10228 The <tt>mersenne_twister_engine</tt> is required to use a seeding method that is given
10229 as an algorithm parameterized over the number of bits <tt>W</tt>. I doubt whether the given generalization
10230 of an algorithm that was originally developed only for unsigned 32-bit integers is appropriate
10231 for other bit widths. For instance, <tt>W</tt> could be theoretically 16 and <tt>UIntType</tt> a 16-bit integer, in
10232 which case the given multiplier would not fit into the <tt>UIntType</tt>. Moreover, T. Nishimura and M.
10233 Matsumoto have chosen a dif ferent multiplier for their 64 bit Mersenne Twister
10234 [<a href="http://www.math.sci.hiroshima-u.ac.jp/%7Em-mat/MT/VERSIONS/C-LANG/mt19937-64.c">reference</a>].
10238 I see two possible resolutions:
10242 <li>Restrict the parameter <tt>W</tt> of the <tt>mersenne_twister_template</tt> to values of 32 or 64 and use the
10243 multiplier from [the above reference] for the 64-bit case (my preference)</li>
10244 <li>Interpret the state array for any <tt>W</tt> as a 32-bit array of appropriate length (and a specified byte
10245 order) and always employ the 32-bit algorithm for seeding
10250 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2424.pdf">N2424</a>
10251 for further discussion.
10261 Stephan Tolksdorf has additional comments on N2424. He comments: "there
10262 is a typo in the required behaviour for mt19937_64: It should be the
10263 10000th (not 100000th) invocation whose value is given, and the value
10264 should be 9981545732273789042 (not 14002232017267485025)." These values
10268 Take the proposed recommendation in N2424 and move to REVIEW.
10275 <p><b>Proposed resolution:</b></p>
10278 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2424.pdf">N2424</a>
10279 for the proposed resolution.
10283 Stephan Tolksdorf adds pre-Bellevue:
10288 I support the proposed resolution in
10289 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2424.pdf">N2424</a>,
10290 but there is a typo in the
10291 required behaviour for <tt>mt19937_64</tt>: It should be the 10000<sup>th</sup> (not
10292 100000<sup>th</sup>) invocation whose value is given, and the value should be
10293 9981545732273789042 (not 14002232017267485025). The change to para. 8
10294 proposed by Charles Karney should also be included in the proposed
10304 Note the main part of the issue is resolved by
10305 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2424.pdf">N2424</a>.
10314 <h3><a name="732"></a>732. Defect in [rand.dist.samp.genpdf]</h3>
10315 <p><b>Section:</b> 26.4.8.5.3 [rand.dist.samp.genpdf] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10316 <b>Submitter:</b> Stephan Tolksdorf <b>Date:</b> 2007-09-21</p>
10317 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.dist.samp.genpdf">issues</a> in [rand.dist.samp.genpdf].</p>
10318 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
10319 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#795">795</a></p>
10320 <p><b>Discussion:</b></p>
10322 26.4.8.5.3 [rand.dist.samp.genpdf] describes the interface for a distribution template that is
10323 meant to simulate random numbers from any general distribution given only the density and the
10324 support of the distribution. I'm not aware of any general purpose algorithm that would be capable
10325 of correctly and efficiently implementing the described functionality. From what I know, this is
10326 essentially an unsolved research problem. Existing algorithms either require more knowledge
10327 about the distribution and the problem domain or work only under very limited circumstances.
10328 Even the state of the art special purpose library UNU.RAN does not solve the problem in full
10329 generality, and in any case, testing and customer support for such a library feature would be a
10334 <b>Possible resolution:</b> For these reasons, I propose to delete section 26.4.8.5.3 [rand.dist.samp.genpdf].
10344 Disagreement persists.
10347 Objection to this issue is that this function takes a general functor.
10348 The general approach would be to normalize this function, integrate it,
10349 and take the inverse of the integral, which is not possible in general.
10350 An example function is sin(1+n*x) -- for any spatial frequency that the
10351 implementor chooses, there is a value of n that renders that choice
10352 arbitrarily erroneous.
10355 Correction: The formula above should instead read 1+sin(n*x).
10358 Objector proposes the following possible compromise positions:
10362 rand.dist.samp.genpdf takes an number of points so that implementor need not guess.
10364 <li>replace rand.disk.samp.genpdf with an extension to either or both
10365 of the discrete functions to take arguments that take a functor and
10366 number of points in place of the list of probabilities. Reference
10367 issues 793 and 794.
10374 <p><b>Proposed resolution:</b></p>
10376 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2424.pdf">N2424</a>
10377 for the proposed resolution.
10385 <h3><a name="734"></a>734. Unnecessary restriction in [rand.dist.norm.chisq]</h3>
10386 <p><b>Section:</b> 26.4.8.4.3 [rand.dist.norm.chisq] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
10387 <b>Submitter:</b> Stephan Tolksdorf <b>Date:</b> 2007-09-21</p>
10388 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
10389 <p><b>Discussion:</b></p>
10391 <tt>chi_squared_distribution</tt>, <tt>fisher_f_distribution</tt> and <tt>student_t_distribution</tt>
10392 have parameters for the "degrees of freedom" <tt>n</tt> and <tt>m</tt> that are specified as integers. For the
10393 following two reasons this is an unnecessary restriction: First, in many applications such as
10394 Bayesian inference or Monte Carlo simulations it is more convenient to treat the respective param-
10395 eters as continuous variables. Second, the standard non-naive algorithms (i.e.
10397 for simulating from these distributions work with floating-point parameters anyway (all three
10398 distributions could be easily implemented using the Gamma distribution, for instance).
10402 Similar arguments could in principle be made for the parameters <tt>t</tt> and <tt>k</tt> of the discrete
10403 <tt>binomial_distribution</tt> and <tt>negative_binomial_distribution</tt>, though in both cases continuous
10404 parameters are less frequently used in practice and in case of the <tt>binomial_distribution</tt>
10405 the implementation would be significantly complicated by a non-discrete parameter (in most
10406 implementations one would need an approximation of the log-gamma function instead of just the
10407 log-factorial function).
10411 <b>Possible resolution:</b> For these reasons, I propose to change the type of the respective parameters
10421 In N2424. Not wildly enthusiastic, not really felt necessary. Less
10422 frequently used in practice. Not terribly bad either. Move to OPEN.
10432 Marc Paterno: The generalizations were explicitly left out when designing the facility. It's harder to test.
10435 Marc Paterno: Ask implementers whether floating-point is a significant burden.
10438 Alisdair: It's neater to do it now, do ask Bill Plauger.
10441 Disposition: move to review with the option for "NAD" if it's not straightforward to implement; unanimous consent.
10447 <p><b>Proposed resolution:</b></p>
10449 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2424.pdf">N2424</a>
10450 for the proposed resolution.
10454 Stephan Tolksdorf adds pre-Bellevue:
10460 In 26.4.8.4.3 [rand.dist.norm.chisq]:
10465 Delete ", where <tt>n</tt> is a positive integer" in the first paragraph.
10469 Replace both occurrences of "<tt>explicit chi_squared_distribution(int n = 1);</tt>"
10470 with "<tt>explicit chi_squared_distribution(RealType n = 1);</tt>".
10474 Replace both occurrences of "<tt>int n() const;</tt>" with "<tt>RealType n() const;</tt>".
10480 In 26.4.8.4.5 [rand.dist.norm.f]:
10484 Delete ", where <tt>m</tt> and <tt>n</tt> are positive integers" in the first paragraph.
10488 Replace both occurrences of
10490 <blockquote><pre>explicit fisher_f_distribution(int m = 1, int n = 1);
10491 </pre></blockquote>
10495 <blockquote><pre>explicit fisher_f_distribution(RealType m = 1, RealType n = 1);
10496 </pre></blockquote>
10499 Replace both occurrences of "<tt>int m() const;" with "RealType m() const;</tt>".
10503 Replace both occurrences of "<tt>int n() const;" with "RealType n() const;</tt>".
10508 In 26.4.8.4.6 [rand.dist.norm.t]:
10513 Delete ", where <tt>n</tt> is a positive integer" in the first paragraph.
10517 Replace both occurrences of "<tt>explicit student_t_distribution(int n = 1);</tt>"
10518 with "<tt>explicit student_t_distribution(RealType n = 1);</tt>".
10522 Replace both occurrences of "<tt>int n() const;</tt>" with "<tt>RealType n() const;</tt>".
10533 <h3><a name="742"></a>742. Enabling <tt>swap</tt> for proxy iterators</h3>
10534 <p><b>Section:</b> 20.1.1 [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10535 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2007-10-10</p>
10536 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#utility.arg.requirements">active issues</a> in [utility.arg.requirements].</p>
10537 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#utility.arg.requirements">issues</a> in [utility.arg.requirements].</p>
10538 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
10539 <p><b>Discussion:</b></p>
10541 This issue was split from <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#672">672</a>. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#672">672</a> now just
10542 deals with changing the requirements of <tt>T</tt> in the <tt>Swappable</tt>
10543 requirement from <tt>CopyConstructible</tt> and <tt>CopyAssignable</tt> to
10544 <tt>MoveConstructible</tt> and <tt>MoveAssignable</tt>.
10548 This issue seeks to widen the <tt>Swappable</tt> requirement to support proxy iterators. Here
10552 <blockquote><pre>namespace Mine {
10554 template <class T>
10555 struct proxy {...};
10557 template <class T>
10558 struct proxied_iterator
10560 typedef T value_type;
10561 typedef proxy<T> reference;
10562 reference operator*() const;
10568 // heavy type, has an optimized swap, maybe isn't even copyable or movable, just swappable
10573 void swap(A&, A&);
10574 void swap(proxy<A>, A&);
10575 void swap(A&, proxy<A>);
10576 void swap(proxy<A>, proxy<A>);
10582 Mine::proxied_iterator<Mine::A> i(...)
10584 <b>swap(*i1, a);</b>
10585 </pre></blockquote>
10588 The key point to note in the above code is that in the call to <tt>swap</tt>, <tt>*i1</tt>
10589 and <tt>a</tt> are different types (currently types can only be <tt>Swappable</tt> with the
10590 same type). A secondary point is that to support proxies, one must be able to pass rvalues
10591 to <tt>swap</tt>. But note that I am not stating that the general purpose <tt>std::swap</tt>
10592 should accept rvalues! Only that overloaded <tt>swap</tt>s, as in the example above, be allowed
10597 That is, no standard library code needs to change. We simply need to have a more flexible
10598 definition of <tt>Swappable</tt>.
10608 While we believe Concepts work will define a swappable concept, we
10609 should still resolve this issue if possible to give guidance to the
10613 Would an ambiguous swap function in two namespaces found by ADL break
10614 this wording? Suggest that the phrase "valid expression" means such a
10615 pair of types would still not be swappable.
10618 Motivation is proxy-iterators, but facility is considerably more
10619 general. Are we happy going so far?
10622 We think this wording is probably correct and probably an improvement on
10623 what's there in the WP. On the other hand, what's already there in the
10624 WP is awfully complicated. Why do we need the two bullet points? They're
10625 too implementation-centric. They don't add anything to the semantics of
10626 what swap() means, which is there in the post-condition. What's wrong
10627 with saying that types are swappable if you can call swap() and it
10628 satisfies the semantics of swapping?
10634 <p><b>Proposed resolution:</b></p>
10636 Change 20.1.1 [utility.arg.requirements]:
10642 -1- The template definitions in the C++ Standard Library refer to various
10643 named requirements whose details are set out in tables 31-38. In these
10644 tables, <tt>T</tt> <ins>and <tt>V</tt> are</ins> <del>is a</del> type<ins>s</ins> to be supplied by a C++ program
10645 instantiating a template; <tt>a</tt>, <tt>b</tt>, and <tt>c</tt> are
10646 values of type <tt>const T</tt>; <tt>s</tt> and <tt>t</tt> are modifiable
10647 lvalues of type <tt>T</tt>; <tt>u</tt> is a value of type (possibly
10648 <tt>const</tt>) <tt>T</tt>; <del>and</del> <tt>rv</tt> is a non-<tt>const</tt>
10649 rvalue of type <tt>T</tt><ins>; <tt>w</tt> is a value of type <tt>T</tt>; and <tt>v</tt> is a value of type <tt>V</tt></ins>.
10653 <caption>Table 37: <tt>Swappable</tt> requirements <b>[swappable]</b></caption>
10654 <tbody><tr><th>expression</th><th>return type</th><th>post-condition</th></tr>
10655 <tr><td><tt>swap(<del>s</del><ins>w</ins>,<del>t</del><ins>v</ins>)</tt></td><td><tt>void</tt></td>
10656 <td><del><tt>t</tt></del><ins><tt>w</tt></ins> has the value originally
10657 held by <del><tt>u</tt></del><ins><tt>v</tt></ins>, and
10658 <del><tt>u</tt></del><ins><tt>v</tt></ins> has the value originally held
10659 by <del><tt>t</tt></del><ins><tt>w</tt></ins></td></tr>
10660 <tr><td colspan="3">
10662 The <tt>Swappable</tt> requirement is met by satisfying one or more of the following conditions:
10666 <tt>T</tt> is <tt>Swappable</tt> if <ins><tt>T</tt> and <tt>V</tt> are
10667 the same type and </ins> <tt>T</tt> satisfies the
10668 <del><tt>CopyConstructible</tt></del>
10669 <ins><tt>MoveConstructible</tt></ins> requirements (Table <del>34</del>
10670 <ins>33</ins>) and the <del><tt>CopyAssignable</tt></del>
10671 <ins><tt>MoveAssignable</tt></ins> requirements (Table <del>36</del>
10675 <tt>T</tt> is <tt>Swappable</tt> <ins>with <tt>V</tt></ins> if a namespace scope function named
10676 <tt>swap</tt> exists in the same namespace as the definition of
10677 <tt>T</tt> <ins>or <tt>V</tt></ins>, such that the expression
10678 <tt>swap(<del>t</del><ins>w</ins>,<del>u</del> <ins>v</ins>)</tt> is valid and has the
10679 semantics described in this table.
10692 <h3><a name="747"></a>747. We have 3 separate type traits to identify classes supporting no-throw operations</h3>
10693 <p><b>Section:</b> 20.5.4.3 [meta.unary.prop] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10694 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2007-10-10</p>
10695 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#meta.unary.prop">issues</a> in [meta.unary.prop].</p>
10696 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
10697 <p><b>Discussion:</b></p>
10699 We have 3 separate type traits to identify classes supporting no-throw
10700 operations, which are very useful when trying to provide exception safety
10701 guarantees. However, I'm not entirely clear on what the current wording
10702 requires of a conforming implementation. To quote from
10703 <tt>has_nothrow_default_constructor</tt>:
10706 or <tt>T</tt> is a class type with a default constructor that is known not to throw
10710 What level of magic do we expect to deduce if this is known?
10716 <blockquote><pre>struct test{
10720 </pre></blockquote>
10722 Should I expect a conforming compiler to
10723 <tt>assert( has_nothrow_constructor<test>::value )</tt>
10726 Is this a QoI issue?
10729 Should I expect to 'know' only if-and-only-if there is an inline definition
10733 Should I never expect that to be true, and insist that the user supplies an
10734 empty throw spec if they want to assert the no-throw guarantee?
10737 It would be helpful to maybe have a footnote explaining what is required,
10738 but right now I don't know what to suggest putting in the footnote.
10741 (agreement since is that trivial ops and explicit no-throws are required.
10742 Open if QoI should be allowed to detect further)
10751 This looks like a QoI issue.
10752 In the case of trivial and nothrow it is known. Static analysis of the program is definitely into QoI.
10753 Move to OPEN. Need to talk to Core about this.
10757 <p><b>Proposed resolution:</b></p>
10766 <h3><a name="750"></a>750. The current definition for <tt>is_convertible</tt> requires that the type be
10767 implicitly convertible, so explicit constructors are ignored.</h3>
10768 <p><b>Section:</b> 20.5.5 [meta.rel] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10769 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2007-10-10</p>
10770 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
10771 <p><b>Discussion:</b></p>
10773 With the pending arrival of explicit conversion functions though, I'm
10774 wondering if we want an additional trait, <tt>is_explictly_convertible</tt>?
10783 Alisdair is considering preparing a paper listing a number of missing
10784 type traits, and feels that it might be useful to handle them all
10785 together rather than piecemeal. This would affect issue 719 and 750.
10786 These two issues should move to OPEN pending AM paper on type traits.
10790 <p><b>Proposed resolution:</b></p>
10799 <h3><a name="751"></a>751. change pass-by-reference members of <tt>vector<bool></tt> to pass-by-value?</h3>
10800 <p><b>Section:</b> 23.2.7 [vector.bool] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
10801 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2007-10-10</p>
10802 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#vector.bool">active issues</a> in [vector.bool].</p>
10803 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#vector.bool">issues</a> in [vector.bool].</p>
10804 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
10805 <p><b>Discussion:</b></p>
10807 A number of vector<bool> members take const bool& as arguments.
10808 Is there any chance we could change them to pass-by-value or would I
10809 be wasting everyone's time if wrote up an issue?
10819 As we understand it, the original requester (Martin Sebor) would like
10820 for implementations to be permitted to pass-by-value. Alisdair suggests
10821 that if this is to be resolved, it should be resolved more generally,
10822 e.g. in other containers as well.
10825 We note that this would break ABI. However, we also suspect that this
10826 might be covered under the "as-if" rule in section 1.9.
10829 Many in the group feel that for vector<bool>, this is a "don't care",
10830 and that at this point in the process it's not worth the bandwidth.
10833 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#679">679</a> -- which was in ready status pre-Bellevue and is
10834 now in the working paper -- is related to this, though not a duplicate.
10837 Moving to Open with a task for Alisdair to craft a informative note to
10838 be put whereever appropriate in the WP. This note would clarify places
10839 where pass-by-const-ref can be transformed to pass-by-value under the
10846 <p><b>Proposed resolution:</b></p>
10855 <h3><a name="752"></a>752. Allocator complexity requirement</h3>
10856 <p><b>Section:</b> 20.1.2 [allocator.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
10857 <b>Submitter:</b> Hans Boehm <b>Date:</b> 2007-10-11</p>
10858 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#allocator.requirements">active issues</a> in [allocator.requirements].</p>
10859 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#allocator.requirements">issues</a> in [allocator.requirements].</p>
10860 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
10861 <p><b>Discussion:</b></p>
10863 Did LWG recently discuss 20.1.2 [allocator.requirements]-2, which states that "All the operations
10864 on the allocators are expected to be amortized constant time."?
10867 As I think I pointed out earlier, this is currently fiction for
10868 <tt>allocate()</tt> if it has to obtain memory from the OS, and it's unclear to
10869 me how to interpret this for <tt>construct()</tt> and <tt>destroy()</tt> if they deal with
10870 large objects. Would it be controversial to officially let these take
10871 time linear in the size of the object, as they already do in real life?
10874 <tt>Allocate()</tt> more blatantly takes time proportional to the size of the
10875 object if you mix in GC. But it's not really a new problem, and I think
10876 we'd be confusing things by leaving the bogus requirements there. The
10877 current requirement on <tt>allocate()</tt> is generally not important anyway,
10878 since it takes O(size) to construct objects in the resulting space.
10879 There are real performance issues here, but they're all concerned with
10880 the constants, not the asymptotic complexity.
10884 <p><b>Proposed resolution:</b></p>
10886 Change 20.1.2 [allocator.requirements]/2:
10891 -2- Table 39 describes the requirements on types manipulated through
10892 allocators. <del>All the operations on the allocators are expected to be
10893 amortized constant time.</del> Table 40 describes the
10894 requirements on allocator types.
10903 <h3><a name="753"></a>753. Move constructor in draft</h3>
10904 <p><b>Section:</b> 20.1.1 [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10905 <b>Submitter:</b> Yechezkel Mett <b>Date:</b> 2007-10-14</p>
10906 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#utility.arg.requirements">active issues</a> in [utility.arg.requirements].</p>
10907 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#utility.arg.requirements">issues</a> in [utility.arg.requirements].</p>
10908 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
10909 <p><b>Discussion:</b></p>
10911 The draft standard n2369 uses the term <i>move constructor</i> in a few
10912 places, but doesn't seem to define it.
10916 <tt>MoveConstructible</tt> requirements are defined in Table 33 in 20.1.1 [utility.arg.requirements] as
10922 <caption><tt>MoveConstructible</tt> requirements</caption>
10924 <th>expression</th> <th>post-condition</th>
10927 <td><tt>T t = rv</tt></td> <td><tt>t</tt> is equivalent to the value of <tt>rv</tt> before the construction</td>
10930 <td colspan="2">[<i>Note:</i> There is no requirement on the value of <tt>rv</tt> after the
10931 construction. <i>-- end note</i>]</td>
10937 (where <tt>rv</tt> is a non-const rvalue of type <tt>T</tt>).
10941 So I assume the move constructor is the constructor that would be used
10942 in filling the above requirement.
10946 For <tt>vector::reserve</tt>, <tt>vector::resize</tt> and the <tt>vector</tt> modifiers given in
10947 23.2.6.4 [vector.modifiers] we have
10951 <i>Requires:</i> If <tt>value_type</tt> has a move constructor, that constructor shall
10952 not throw any exceptions.
10956 Firstly "If <tt>value_type</tt> has a move constructor" is superfluous; every
10957 type which can be put into a <tt>vector</tt> has a move constructor (a copy
10958 constructor is also a move constructor). Secondly it means that for
10959 any <tt>value_type</tt> which has a throwing copy constructor and no other move
10960 constructor these functions cannot be used -- which I think will come
10961 as a shock to people who have been using such types in <tt>vector</tt> until
10966 I can see two ways to correct this. The simpler, which is presumably
10967 what was intended, is to say "If <tt>value_type</tt> has a move constructor and
10968 no copy constructor, the move constructor shall not throw any
10969 exceptions" or "If <tt>value_type</tt> has a move constructor which changes the
10970 value of its parameter,".
10974 The other alternative is add to <tt>MoveConstructible</tt> the requirement that
10975 the expression does not throw. This would mean that not every type
10976 that satisfies the <tt>CopyConstructible</tt> requirements also satisfies the
10977 <tt>MoveConstructible</tt> requirements. It would mean changing requirements in
10978 various places in the draft to allow either <tt>MoveConstructible</tt> or
10979 <tt>CopyConstructible</tt>, but I think the result would be clearer and
10980 possibly more concise too.
10984 <p><b>Proposed resolution:</b></p>
10986 Add new defintions to 17.1 [definitions]:
10991 <b>move constructor</b>
10994 a constructor which accepts only rvalue arguments of that type, and modifies the rvalue as a
10995 side effect during the construction.
10998 <b>move assignment operator</b>
11001 an assignment operator which accepts only rvalue arguments of that type, and modifies the rvalue as a
11002 side effect during the assignment.
11005 <b>move assignment</b>
11008 use of the move assignment operator.
11013 Howard adds post-Bellevue:
11019 Unfortunately I believe the wording recommended by the LWG in Bellevue is incorrect. <tt>reserve</tt> et. al. will use a move constructor
11020 if one is available, else it will use a copy constructor. A type may have both. If the move constructor is
11021 used, it must not throw. If the copy constructor is used, it can throw. The sentence in the proposed wording
11022 is correct without the recommended insertion. The Bellevue LWG recommended moving this issue to Ready. I am
11023 unfortunately pulling it back to Open. But I'm drafting wording to atone for this egregious action. :-)
11033 <h3><a name="758"></a>758. <tt>shared_ptr</tt> and <tt>nullptr</tt></h3>
11034 <p><b>Section:</b> 20.7.12.2 [util.smartptr.shared] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
11035 <b>Submitter:</b> Joe Gottman <b>Date:</b> 2007-10-31</p>
11036 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#util.smartptr.shared">active issues</a> in [util.smartptr.shared].</p>
11037 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#util.smartptr.shared">issues</a> in [util.smartptr.shared].</p>
11038 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
11039 <p><b>Discussion:</b></p>
11041 Consider the following program:
11044 <blockquote><pre>int main() {
11045 shared_ptr<int> p(nullptr);
11048 </pre></blockquote>
11051 This program will fail to compile because <tt>shared_ptr</tt> uses the following
11052 template constructor to construct itself from pointers:
11055 <blockquote><pre>template <class Y> shared_ptr(Y *);
11056 </pre></blockquote>
11060 to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf">N2431</a>,
11061 the conversion from <tt>nullptr_t</tt> to <tt>Y *</tt> is not
11062 deducible, so the above constructor will not be found. There are similar problems with the
11063 constructors that take a pointer and a <tt>deleter</tt> or a
11064 pointer, a <tt>deleter</tt> and an allocator, as well as the
11065 corresponding forms of <tt>reset()</tt>. Note that <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2435.htm">N2435</a>
11066 will solve this problem for constructing from just <tt>nullptr</tt>, but not for constructors that use
11067 <tt>deleters</tt> or allocators or for <tt>reset()</tt>.
11071 In the case of the functions that take deleters, there is the additional
11072 question of what argument should be passed to the deleter when it is
11073 eventually called. There are two reasonable possibilities: <tt>nullptr</tt> or
11074 <tt>static_cast<T *>(0)</tt>, where <tt>T</tt> is the template argument of the
11075 <tt>shared_ptr</tt>. It is not immediately clear which of these is better. If
11076 <tt>D::operator()</tt> is a template function similar to <tt>shared_ptr</tt>'s
11077 constructor, then <tt>d(static_cast<T*>(0))</tt> will compile and <tt>d(nullptr)</tt>
11078 will not. On the other hand, if <tt>D::operator()()</tt> takes a parameter that
11079 is a pointer to some type other that <tt>T</tt> (for instance <tt>U*</tt> where <tt>U</tt> derives
11080 from <tt>T</tt>) then <tt>d(nullptr)</tt> will compile and <tt>d(static_cast<T *>(0))</tt> may not.
11090 The general idea is right, we need to be able to pass a nullptr to a
11091 shared_ptr, but there are a few borderline editorial issues here. (For
11092 example, the single-argument nullptr_t constructor in the class synopsis
11093 isn't marked explicit, but it is marked explicit in the proposed wording
11094 for 20.6.6.2.1. There is a missing empty parenthesis in the form that
11095 takes a nullptr_t, a deleter, and an allocator.)
11098 More seriously: this issue says that a shared_ptr constructed from a
11099 nullptr is empty. Since "empty" is undefined, it's hard to know whether
11100 that's right. This issue is pending on handling that term better.
11103 Peter suggests definition of empty should be "does not own anything"
11106 Is there an editorial issue that post-conditions should refer to get() =
11107 nullptr, rather than get() = 0?
11110 No strong feeling towards accept or NAD, but prefer to make a decision than leave it open.
11113 Seems there are no technical merits between NAD and Ready, comes down to
11114 "Do we intentially want to allow/disallow null pointers with these
11115 functions". Staw Poll - support null pointers 5 - No null pointers 0
11118 Move to Ready, modulo editorial comments
11123 post Bellevue Peter adds:
11129 The following wording changes are less intrusive:
11133 In 20.7.12.2.1 [util.smartptr.shared.const], add:
11136 <blockquote><pre>shared_ptr(nullptr_t);
11137 </pre></blockquote>
11143 <blockquote><pre>shared_ptr();
11144 </pre></blockquote>
11147 (Absence of explicit intentional.)
11151 <tt>px.reset( nullptr )</tt> seems a somewhat contrived way to write <tt>px.reset()</tt>, so
11152 I'm not convinced of its utility.
11155 It's similarly not clear to me whether the deleter constructors need to be
11156 extended to take <tt>nullptr</tt>, but if they need to:
11162 <blockquote><pre>template<class D> shared_ptr(nullptr_t p, D d);
11163 template<class D, class A> shared_ptr(nullptr_t p, D d, A a);
11164 </pre></blockquote>
11170 <blockquote><pre>template<class Y, class D> shared_ptr(Y* p, D d);
11171 template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
11172 </pre></blockquote>
11175 Note that this changes the semantics of the new constructors such that they
11176 consistently call <tt>d(p)</tt> instead of <tt>d((T*)0)</tt> when <tt>p</tt> is <tt>nullptr</tt>.
11179 The ability to be able to pass <tt>0/NULL</tt> to a function that takes a <tt>shared_ptr</tt>
11180 has repeatedly been requested by users, but the other additions that the
11181 proposed resolution makes are not supported by real world demand or
11182 motivating examples.
11185 It might be useful to split the obvious and non-controversial <tt>nullptr_t</tt>
11186 constructor into a separate issue. Waiting for "empty" to be clarified is
11187 unnecessary; this is effectively an alias for the default constructor.
11198 We want to remove the reset functions from the proposed resolution.
11201 The remaining proposed resolution text (addressing the constructors) are wanted.
11204 Disposition: move to review. The review should check the wording in the then-current working draft.
11210 <p><b>Proposed resolution:</b></p>
11212 Add the following constructors to 20.7.12.2 [util.smartptr.shared]:
11215 <blockquote><pre>shared_ptr(nullptr_t);
11216 template <class D> shared_ptr(nullptr_t, D d);
11217 template <class D, class A> shared_ptr(nullptr_t, D d, A a);
11218 </pre></blockquote>
11223 Add the following constructor definitions to 20.7.12.2.1 [util.smartptr.shared.const]:
11227 <pre> explicit shared_ptr(nullptr_t);
11231 <i>Effects:</i> Constructs an empty shared_ptr object.
11234 <i>Postconditions:</i> <tt>use_count() == 0 && get() == 0</tt>.
11237 <i>Throws:</i> nothing.
11243 <pre>template <class D> shared_ptr(nullptr_t, D d);
11244 template <class D, class A> shared_ptr<nullptr_t, D d, A a);
11248 <i>Requires:</i> <tt>D</tt> shall be <tt>CopyConstructible</tt>. The copy constructor and
11249 destructor of <tt>D</tt> shall not throw exceptions. The expression
11250 <tt>d(static_cast<T *>(0))</tt> shall be well-formed, shall have well defined behavior,
11251 and shall not throw exceptions. <tt>A</tt> shall be an allocator (20.1.2 [allocator.requirements]).
11252 The copy constructor and destructor of <tt>A</tt> shall not throw
11256 <i>Effects:</i> Constructs a <tt>shared_ptr</tt> object that owns a null pointer of type <tt>T *</tt>
11257 and deleter <tt>d</tt>. The
11258 second constructor shall use a copy of <tt>a</tt> to allocate memory for
11262 <i>Postconditions:</i> <tt>use_count() == 1</tt> and <tt>get() == 0</tt>.
11265 <i>Throws:</i> <tt>bad_alloc</tt>, or an implementation-defined exception when a
11266 resource other than memory could not be obtained.
11269 <i>Exception safety:</i> If an exception is thrown, <tt>d(static_cast<Y *>(nullptr))</tt> is called.
11282 <h3><a name="760"></a>760. The emplace issue</h3>
11283 <p><b>Section:</b> 23.1 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
11284 <b>Submitter:</b> Paolo Carlini <b>Date:</b> 2007-11-11</p>
11285 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements">active issues</a> in [container.requirements].</p>
11286 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements">issues</a> in [container.requirements].</p>
11287 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
11288 <p><b>Discussion:</b></p>
11290 In an emplace member function the function parameter pack may be bound
11291 to a priori unlimited number of objects: some or all of them can be
11292 elements of the container itself. Apparently, in order to conform to the
11293 blanket statement 23.1 [container.requirements]/11, the implementation must check all of them for
11294 that possibility. A possible solution can involve extending the
11295 exception in 23.1 [container.requirements]/12 also to the emplace member. As a side note, the
11296 <tt>push_back</tt> and <tt>push_front</tt> member functions are luckily not affected by
11297 this problem, can be efficiently implemented anyway
11301 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#767">767</a>
11312 The proposed addition (13) is partially redundant with the existing
11313 paragraph 12. Why was the qualifier "rvalues" added to paragraph 12? Why
11314 does it not cover subelements and pointers?
11317 Resolution: Alan Talbot to rework language, then set state to Review.
11323 <p><b>Proposed resolution:</b></p>
11325 Add after 23.1 [container.requirements]/12:
11330 -12- Objects passed to member functions of a container as rvalue references shall not be elements of that container. No
11331 diagnostic required.
11335 -13- Objects bound to the function parameter pack of the <tt>emplace</tt> member function shall not be elements or
11336 sub-objects of elements of the container. No diagnostic required.
11348 <h3><a name="762"></a>762. <tt>std::unique_ptr</tt> requires complete type?</h3>
11349 <p><b>Section:</b> 20.7.11 [unique.ptr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
11350 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2007-11-30</p>
11351 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unique.ptr">issues</a> in [unique.ptr].</p>
11352 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
11353 <p><b>Discussion:</b></p>
11355 In contrast to the proposed <tt>std::shared_ptr</tt>, <tt>std::unique_ptr</tt>
11356 does currently not support incomplete types, because it
11357 gives no explicit grant - thus instantiating <tt>unique_ptr</tt> with
11358 an incomplete pointee type <tt>T</tt> automatically belongs to
11359 undefined behaviour according to 17.4.3.7 [res.on.functions]/2, last
11360 bullet. This is an unnecessary restriction and prevents
11361 many well-established patterns - like the bridge pattern -
11362 for <tt>std::unique_ptr</tt>.
11371 Move to open. The LWG is comfortable with the intent of allowing
11372 incomplete types and making <tt>unique_ptr</tt> more like <tt>shared_ptr</tt>, but we are
11373 not comfortable with the wording. The specification for <tt>unique_ptr</tt>
11374 should be more like that of <tt>shared_ptr</tt>. We need to know, for individual
11375 member functions, which ones require their types to be complete. The
11376 <tt>shared_ptr</tt> specification is careful to say that for each function, and
11377 we need the same level of care here. We also aren't comfortable with the
11378 "part of the operational semantic" language; it's not used elsewhere in
11379 the standard, and it's not clear what it means. We need a volunteer to
11380 produce new wording.
11384 <p><b>Proposed resolution:</b></p>
11386 The proposed changes in the following revision refers to the current state of
11387 N2521 including the assumption that 20.7.11.4 [unique.ptr.compiletime] will be removed
11388 according to the current state of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#740">740</a>.
11391 The specialization <tt>unique_ptr<T[]></tt> has some more restrictive constraints on
11392 type-completeness on <tt>T</tt> than <tt>unique_ptr<T></tt>. The following proposed wordings
11393 try to cope with that. If the committee sees less usefulness on relaxed
11394 constraints on <tt>unique_ptr<T[]></tt>, the alternative would be to stop this relaxation
11395 e.g. by adding one further bullet to 20.7.11.3 [unique.ptr.runtime]/1:
11396 "<tt>T</tt> shall be a complete type, if used as template argument of
11397 <tt>unique_ptr<T[], D></tt>
11400 This issue has some overlap with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a>, but it seems not to cause any
11401 problems with this one,
11402 because <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a> adds only optional requirements on <tt>D</tt> that do not conflict
11403 with the here discussed
11404 ones, provided that <tt>D::pointer</tt>'s operations (including default
11405 construction, copy construction/assignment,
11406 and pointer conversion) are specified <em>not</em> to throw, otherwise this
11407 would have impact on the
11408 current specification of <tt>unique_ptr</tt>.
11414 In 20.7.11 [unique.ptr]/2 add as the last sentence to the existing para:
11418 The <tt>unique_ptr</tt> provides a semantics of strict ownership. A
11419 <tt>unique_ptr</tt> owns the object it holds a pointer to. A
11420 <tt>unique_ptr</tt> is not <tt>CopyConstructible</tt>, nor
11421 <tt>CopyAssignable</tt>, however it is <tt>MoveConstructible</tt> and
11422 <tt>MoveAssignable</tt>. <ins>The template parameter <tt>T</tt> of
11423 <tt>unique_ptr</tt> may be an incomplete type.</ins> [ <i>Note:</i> The
11424 uses of <tt>unique_ptr</tt> include providing exception safety for
11425 dynamically allcoated memory, passing ownership of dynamically allocated
11426 memory to a function, and returning dynamically allocated memory from a
11427 function. -- <i>end note</i> ]
11433 20.7.11.2.1 [unique.ptr.single.ctor]/1: No changes necessary.
11438 N.B.: We only need the requirement that <tt>D</tt> is <tt>DefaultConstructible</tt>.
11439 The current wording says just this.
11447 In 20.7.11.2.1 [unique.ptr.single.ctor]/5 change the requires clause to say:
11452 <i>Requires:</i> <del>The expression <tt>D()(p)</tt> shall be well formed. The default constructor
11453 of <tt>D</tt> shall not throw an exception.</del>
11454 <del><tt>D</tt> must not be a reference type.</del>
11456 <tt>D</tt> shall be default constructible, and that construction
11457 shall not throw an exception.
11461 N.B.: There is no need that the expression <tt>D()(p)</tt> is well-formed at
11462 this point. I assume that the current wording is based on the
11463 corresponding <tt>shared_ptr</tt> wording. In case of <tt>shared_ptr</tt> this
11464 requirement is necessary, because the corresponding c'tor *can* fail
11465 and must invoke delete <tt>p/d(p)</tt> in this case. <tt>Unique_ptr</tt> is simpler in
11466 this regard. The *only* functions that must insist on well-formedness
11467 and well-definedness of the expression <tt>get_deleter()(get())</tt> are (1)
11468 the destructor and (2) <tt>reset</tt>. The reasoning for the wording change to
11469 explicitly require <tt>DefaultConstructible</tt> of <tt>D</tt> is to guarantee that
11471 <tt>D</tt>'s default c'tor is both well-formed and well-defined. Note also that
11472 we do *not* need the
11473 requirement that <tt>T</tt> must be complete, also in contrast to <tt>shared_ptr</tt>.
11474 <tt>Shared_ptr</tt> needs this, because it's c'tor is a template c'tor which
11475 potentially requires <tt>Convertible<Y*, X*></tt>, which
11476 again requires Completeness of <tt>Y</tt>, if <tt>!SameType<X, Y></tt>
11484 Merge 20.7.11.2.1 [unique.ptr.single.ctor]/12+13 thereby removing the sentence
11485 of 12, but transferring the "requires" to 13:
11490 <i>Requires:</i> If <tt>D</tt> is not an lvalue-reference type then[..]
11493 N.B.: For the same reasons as for (3), there is no need that <tt>d(p)</tt> is
11494 well-formed/well-defined at this point. The current wording guarantees
11495 all what we need, namely that the initialization of both the <tt>T*</tt>
11496 pointer and the <tt>D</tt> deleter are well-formed and well-defined.
11503 20.7.11.2.1 [unique.ptr.single.ctor]/17: No changes necessary.
11506 <p>20.7.11.2.1 [unique.ptr.single.ctor]/21:</p>
11509 <i>Requires:</i> If <tt>D</tt> is not a reference type, construction of
11510 the deleter <tt>D</tt> from an rvalue of type <tt>E</tt> shall be well
11511 formed and shall not throw an exception. If <tt>D</tt> is a reference
11512 type, then <tt>E</tt> shall be the same type as <tt>D</tt> (diagnostic
11513 required). <tt>U*</tt> shall be implicitly convertible to <tt>T*</tt>.
11514 <ins>[<i>Note:</i> These requirements imply that <tt>T</tt> and <tt>U</tt>
11515 be complete types. <i>-- end note</i>]</ins>
11519 N.B.: The current wording of 21 already implicitly guarantees that <tt>U</tt>
11520 is completely defined, because it requires that <tt>Convertible<U*, T*></tt> is
11521 true. If the committee wishes this explicit requirement can be added,
11522 e.g. "<tt>U</tt> shall be a complete type."
11529 20.7.11.2.2 [unique.ptr.single.dtor]: Just before p1 add a new paragraph:
11533 <i>Requires:</i> The expression <tt>get_deleter()(get())</tt> shall be well-formed,
11534 shall have well-defined behavior, and shall not throw exceptions.
11535 <ins>[<i>Note:</i> The use of <tt>default_delete</tt> requires <tt>T</tt> to
11536 be a complete type. <i>-- end note</i>]</ins>
11539 N.B.: This requirement ensures that the whole responsibility on
11540 type-completeness of <tt>T</tt> is delegated to this expression.
11548 20.7.11.2.3 [unique.ptr.single.asgn]/1: No changes necessary, except the
11549 current editorial issue, that "must shall" has to be changed to
11550 "shall", but this change is not a special part of this resolution.
11554 N.B. The current wording is sufficient, because we can delegate all
11555 further requirements on the requirements of the effects clause
11562 20.7.11.2.3 [unique.ptr.single.asgn]/6:
11566 <i>Requires:</i> Assignment of the deleter <tt>D</tt> from an rvalue
11567 <tt>D</tt> shall not throw an exception. <tt>U*</tt> shall be implicitly
11568 convertible to <tt>T*</tt>.
11569 <ins>[<i>Note:</i> These requirements imply that <tt>T</tt> and <tt>U</tt>
11570 be complete types. <i>-- end note</i>]</ins>
11574 N.B.: The current wording of p. 6 already implicitly guarantees that
11575 <tt>U</tt> is completely defined, because it requires that <tt>Convertible<U*, T*></tt>
11576 is true, see (6)+(8).
11583 20.7.11.2.3 [unique.ptr.single.asgn]/11: No changes necessary.
11586 N.B.: Delegation to requirements of effects clause is sufficient.
11592 20.7.11.2.4 [unique.ptr.single.observers]/1+4+7+9+11:
11596 <pre>T* operator->() const;</pre>
11598 <ins><i>Note:</i> Use typically requires <tt>T</tt> shall be complete. <i>-- end note</i>]</ins>
11603 20.7.11.2.5 [unique.ptr.single.modifiers]/1: No changes necessary.
11608 20.7.11.2.5 [unique.ptr.single.modifiers]/4: Just before p. 4 add a new paragraph:
11611 <i>Requires:</i> The expression <tt>get_deleter()(get())</tt> shall be well-formed,
11612 shall have well-defined behavior, and shall not throw exceptions.
11617 20.7.11.2.5 [unique.ptr.single.modifiers]/7: No changes necessary.
11622 20.7.11.3 [unique.ptr.runtime]: Add one additional bullet on paragraph 1:
11627 A specialization for array types is provided with a slightly altered interface.
11635 <ins><tt>T</tt> shall be a complete type.</ins>
11643 post Bellevue: Daniel provided revised wording.
11653 <h3><a name="765"></a>765. more on iterator validity</h3>
11654 <p><b>Section:</b> 24.1 [iterator.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
11655 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2007-12-14</p>
11656 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#iterator.requirements">active issues</a> in [iterator.requirements].</p>
11657 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iterator.requirements">issues</a> in [iterator.requirements].</p>
11658 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
11659 <p><b>Discussion:</b></p>
11662 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#278">278</a>
11663 defines the meaning of the term "invalid iterator" as one that may be
11669 Consider the following code:
11672 <pre> std::deque<int> x, y;
11673 std::deque<int>::iterator i = x.end(), j = y.end();
11678 Given that <code>swap()</code> is required not to invalidate iterators
11679 and using the definition above, what should be the expected result of
11680 comparing <code>i</code> and <code>j</code> to <code>x.end()</code>
11681 and <code>y.end()</code>, respectively, after the <code>swap()</code>?
11686 I.e., is the expression below required to evaluate
11687 to <code>true</code>?
11690 <pre> i == y.end() && j == x.end()
11694 (There are at least two implementations where the expression
11695 returns <code>false</code>.)
11700 More generally, is the definition introduced in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#278">278</a> meant to
11701 make any guarantees about whether iterators actually point to the same
11702 elements or be associated with the same containers after a
11703 non-invalidating operation as they did before?
11708 Here's a motivating example intended to demonstrate the importance of
11712 <pre> Container x, y ({ 1, 2}); // pseudocode to initialize y with { 1, 2 }
11713 Container::iterator i = y.begin() + 1;
11714 Container::iterator j = y.end();
11716 std::find(i, j, 3);
11720 <code>swap()</code> guarantees that <code>i</code> and <code>j</code>
11721 continue to be valid. Unless the spec says that even though they are
11722 valid they may no longer denote a valid range the code above must be
11723 well-defined. Expert opinions on this differ as does the behavior of
11724 popular implementations for some standard <code>Containers</code>.
11729 <p><b>Proposed resolution:</b></p>
11738 <h3><a name="769"></a>769. std::function should use nullptr_t instead of "unspecified-null-pointer-type"</h3>
11739 <p><b>Section:</b> 20.6.15.2 [func.wrap.func] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
11740 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-01-10</p>
11741 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
11742 <p><b>Discussion:</b></p>
11744 N2461 already replaced in 20.6.15.2 [func.wrap.func] it's originally proposed
11745 (implicit) conversion operator to "unspecified-bool-type" by the new
11746 explicit bool conversion, but the inverse conversion should also
11747 use the new <tt>std::nullptr_t</tt> type instead of "unspecified-null-pointer-
11752 <p><b>Proposed resolution:</b></p>
11755 In 20.6 [function.objects], header <tt><functional></tt> synopsis replace:
11758 <blockquote><pre>template<class R, class... ArgTypes>
11759 bool operator==(const function<R(ArgTypes...)>&, <del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11760 template<class R, class... ArgTypes>
11761 bool operator==(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins> , const function<R(ArgTypes...)>&);
11762 template<class R, class... ArgTypes>
11763 bool operator!=(const function<R(ArgTypes...)>&, <del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11764 template<class R, class... ArgTypes>
11765 bool operator!=(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins> , const function<R(ArgTypes...)>&);
11766 </pre></blockquote>
11769 In the class function synopsis of 20.6.15.2 [func.wrap.func] replace
11772 <blockquote><pre>function(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11774 function& operator=(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11775 </pre></blockquote>
11778 In 20.6.15.2 [func.wrap.func], "Null pointer comparisons" replace:
11781 <blockquote><pre>template <class R, class... ArgTypes>
11782 bool operator==(const function<R(ArgTypes...)>&, <del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11783 template <class R, class... ArgTypes>
11784 bool operator==(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins> , const function<R(ArgTypes...)>&);
11785 template <class R, class... ArgTypes>
11786 bool operator!=(const function<R(ArgTypes...)>&, <del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11787 template <class R, class... ArgTypes>
11788 bool operator!=(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins> , const function<R(ArgTypes...)>&);
11789 </pre></blockquote>
11792 In 20.6.15.2.1 [func.wrap.func.con], replace
11795 <blockquote><pre>function(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11797 function& operator=(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11798 </pre></blockquote>
11801 In 20.6.15.2.6 [func.wrap.func.nullptr], replace
11804 <blockquote><pre>template <class R, class... ArgTypes>
11805 bool operator==(const function<R(ArgTypes...)>& f, <del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11806 template <class R, class... ArgTypes>
11807 bool operator==(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins> , const function<R(ArgTypes...)>& f);
11808 </pre></blockquote>
11814 <blockquote><pre>template <class R, class... ArgTypes>
11815 bool operator!=(const function<R(ArgTypes...)>& f, <del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins>);
11816 template <class R, class... ArgTypes>
11817 bool operator!=(<del>unspecified-null-pointer-type</del> <ins>nullptr_t</ins> , const function<R(ArgTypes...)>& f);
11818 </pre></blockquote>
11826 <h3><a name="771"></a>771. Impossible throws clause in [string.conversions]</h3>
11827 <p><b>Section:</b> 21.4 [string.conversions] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
11828 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-01-13</p>
11829 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#string.conversions">active issues</a> in [string.conversions].</p>
11830 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#string.conversions">issues</a> in [string.conversions].</p>
11831 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
11832 <p><b>Discussion:</b></p>
11834 The new <tt>to_string</tt> and <tt>to_wstring</tt> functions described in 21.4 [string.conversions]
11835 have throws clauses (paragraphs 8 and 16) which say:
11839 <i>Throws:</i> nothing
11843 Since all overloads return either a <tt>std::string</tt> or a <tt>std::wstring</tt> by value
11844 this throws clause is impossible to realize in general, since the <tt>basic_string</tt>
11845 constructors can fail due to out-of-memory conditions. Either these throws
11846 clauses should be removed or should be more detailled like:
11850 <i>Throws:</i> Nothing if the string construction throws nothing
11854 Further there is an editorial issue in p. 14: All three <tt>to_wstring</tt>
11855 overloads return a <tt>string</tt>, which should be <tt>wstring</tt> instead (The
11856 header <tt><string></tt> synopsis of 21.2 [string.classes] is correct in this
11862 <p><b>Proposed resolution:</b></p>
11864 In 21.4 [string.conversions], remove the paragraphs 8 and 16.
11868 <pre>string to_string(long long val);
11869 string to_string(unsigned long long val);
11870 string to_string(long double val);
11873 <del><i>Throws:</i> nothing</del>
11878 <pre><ins>w</ins>string to_wstring(long long val);
11879 <ins>w</ins>string to_wstring(unsigned long long val);
11880 <ins>w</ins>string to_wstring(long double val);
11883 <del><i>Throws:</i> nothing</del>
11893 <h3><a name="772"></a>772. Impossible return clause in [string.conversions]</h3>
11894 <p><b>Section:</b> 21.4 [string.conversions] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
11895 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-01-13</p>
11896 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#string.conversions">active issues</a> in [string.conversions].</p>
11897 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#string.conversions">issues</a> in [string.conversions].</p>
11898 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
11899 <p><b>Discussion:</b></p>
11901 The return clause 21.4 [string.conversions]/paragraph 15 of the new <tt>to_wstring</tt>
11906 <i>Returns:</i> each function returns a <tt>wstring</tt> object holding the character
11907 representation of the value of its argument that would be generated by
11908 calling <tt>wsprintf(buf, fmt, val)</tt> with a format specifier of <tt>L"%lld"</tt>, <tt>L"%ulld"</tt>,
11909 or <tt>L"%f"</tt>, respectively.
11913 Problem is: There does not exist any <tt>wsprintf</tt> function in C99 (I checked
11914 the 2nd edition of ISO 9899, and the first and the second corrigenda from
11915 2001-09-01 and 2004-11-15). What probably meant here is the function
11916 <tt>swprintf</tt> from <tt><wchar.h>/<cwchar></tt>, but this has the non-equivalent
11920 <blockquote><pre>int swprintf(wchar_t * restrict s, size_t n,
11921 const wchar_t * restrict format, ...);
11922 </pre></blockquote>
11925 therefore the paragraph needs to mention the <tt>size_t</tt> parameter <tt>n</tt>.
11930 <p><b>Proposed resolution:</b></p>
11932 Change the current wording of 21.4 [string.conversions]/p. 15 to:
11936 <i>Returns:</i> <del>e</del><ins>E</ins>ach function returns a
11937 <tt>wstring</tt> object holding the character representation of the
11938 value of its argument that would be generated by calling
11939 <tt><del>ws</del><ins>sw</ins>printf(buf, <ins>bufsz,</ins> fmt,
11940 val)</tt> with a format specifier <ins><tt>fmt</tt></ins> of <tt>L"%lld"</tt>,
11941 <tt>L"%ulld"</tt>, or <tt>L"%f"</tt>, respectively<ins>, where <tt>buf</tt>
11942 designates an internal character buffer of sufficient size <tt>bufsz</tt></ins>.
11946 [Hint to the editor: The resolution also adds to mention the name of
11947 the format specifier "fmt"]
11951 I also would like to remark that the current wording of it's equivalent
11952 paragraph 7 should also mention the meaning of <tt>buf</tt> and <tt>fmt</tt>.
11956 Change the current wording of 21.4 [string.conversions]/p. 7 to:
11960 <i>Returns:</i> <del>e</del><ins>E</ins>ach function returns a string object holding the
11961 character representation of the value of its argument that would be
11962 generated by calling <tt>sprintf(buf, fmt, val)</tt> with a format specifier <ins><tt>fmt</tt></ins> of
11963 <tt>"%lld"</tt>, <tt>"%ulld"</tt>, or <tt>"%f"</tt>, respectively<ins>, where <tt>buf</tt> designates an internal
11964 character buffer of sufficient size</ins>.
11973 <h3><a name="774"></a>774. Member swap undefined for most containers</h3>
11974 <p><b>Section:</b> 23 [containers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
11975 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-01-14</p>
11976 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#containers">active issues</a> in [containers].</p>
11977 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#containers">issues</a> in [containers].</p>
11978 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
11979 <p><b>Discussion:</b></p>
11981 It appears most containers declare but do not define a member-swap
11986 This is unfortunate, as all overload the <tt>swap</tt> algorithm to call the
11987 member-swap function!
11988 (required for <tt>swappable</tt> guarantees [Table 37] and Container Requirements
11993 Note in particular that Table 87 gives semantics of <tt>a.swap(b)</tt> as <tt>swap(a,b)</tt>,
11994 yet for all containers we define <tt>swap(a,b)</tt> to call <tt>a.swap(b)</tt> - a circular
11999 A quick survey of clause 23 shows that the following containers provide a
12000 definition for member-swap:
12003 <blockquote><pre>array
12007 </pre></blockquote>
12010 Whereas the following declare it, but do not define the semantics:
12013 <blockquote><pre>deque
12021 unordered_multi_map
12022 unordered_multi_set
12024 </pre></blockquote>
12027 Suggested resolution:
12030 Provide a definition for each of the affected containers...
12039 Move to Open and ask Alisdair to provide wording.
12043 <p><b>Proposed resolution:</b></p>
12045 Wording provided in
12046 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2590.pdf">N2590</a>.
12054 <h3><a name="776"></a>776. Undescribed assign function of std::array</h3>
12055 <p><b>Section:</b> 23.2.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
12056 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-01-20</p>
12057 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#array">active issues</a> in [array].</p>
12058 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#array">issues</a> in [array].</p>
12059 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
12060 <p><b>Discussion:</b></p>
12062 The class template array synopsis in 23.2.1 [array]/3 declares a member
12066 <blockquote><pre>void assign(const T& u);
12067 </pre></blockquote>
12070 which's semantic is no-where described. Since this signature is
12071 not part of the container requirements, such a semantic cannot
12072 be derived by those.
12076 I found only one reference to this function in the issue list,
12077 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#588">588</a> where the question is raised:
12081 what's the effect of calling <tt>assign(T&)</tt> on a zero-sized array?
12085 which does not answer the basic question of this issue.
12089 If this function shall be part of the <tt>std::array</tt>, it's probable
12090 semantic should correspond to that of <tt>boost::array</tt>, but of
12091 course such wording must be added.
12095 <p><b>Proposed resolution:</b></p>
12097 Just after the section 23.2.1.4 [array.data] add the following new section:
12101 23.2.1.5 array::fill [array.fill]
12105 <pre>void fill(const T& u);
12109 1: <i>Effects:</i> <tt>fill_n(begin(), N, u)</tt>
12114 [N.B: I wonder, why class <tt>array</tt> does not have a "modifiers"
12115 section. If it had, then <tt>assign</tt> would naturally belong to it]
12119 Change the synopsis in 23.2.1 [array]/3:
12122 <blockquote><pre>template <class T, size_t N>
12125 void <del>assign</del> <ins>fill</ins>(const T& u);
12127 </pre></blockquote>
12137 Suggest substituting "fill" instead of "assign".
12140 Set state to Review given substitution of "fill" for "assign".
12148 <h3><a name="779"></a>779. Resolution of #283 incomplete</h3>
12149 <p><b>Section:</b> 25.2.8 [alg.remove] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
12150 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-01-25</p>
12151 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#alg.remove">issues</a> in [alg.remove].</p>
12152 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
12153 <p><b>Discussion:</b></p>
12155 The resolution of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#283">283</a> did not resolve similar necessary changes for algorithm
12156 <tt>remove_copy[_if]</tt>,
12157 which seems to be an oversight.
12161 <p><b>Proposed resolution:</b></p>
12163 In 25.2.8 [alg.remove]/p.6, replace the N2461 requires clause with:
12167 <i>Requires:</i> <del>Type <tt>T</tt> is <tt>EqualityComparable</tt> (31).</del> The ranges <tt>[first,last)</tt>
12168 and <tt>[result,result + (last - first))</tt> shall not overlap. <ins>The expression <tt>*result = *first</tt> shall be
12178 <h3><a name="780"></a>780. <tt>std::merge()</tt> specification incorrect/insufficient</h3>
12179 <p><b>Section:</b> 25.3.4 [alg.merge] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
12180 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-01-25</p>
12181 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
12182 <p><b>Discussion:</b></p>
12184 Though issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#283">283</a> has fixed many open issues, it seems that some are still open:
12188 Both 25.3.4 [lib.alg.merge] in 14882:2003 and 25.3.4 [alg.merge] in N2461
12189 have no Requires element and the Effects element contains some requirements,
12190 which is probably editorial. Worse is that:
12195 no assignment requirements are specified (neither implicit nor explicit).
12199 the effects clause just speaks of "merges", which is badly worded
12200 near to a circular definition.
12204 p. 2 mentions a range <tt>[first, last)</tt>, which is not defined by the
12205 function arguments or otherwise.
12209 p. 2 says "according to the ordering defined by comp" which is both
12210 incomplete (because
12211 this excludes the first variant with <) and redundant (because the
12212 following subordinate
12213 clause mentions comp again)
12219 <p><b>Proposed resolution:</b></p>
12221 In 25.3.4 [alg.merge] replace p.1+ 2:
12226 <i>Effects:</i> <del>Merges</del> <ins>Copies all the elements of the</ins> two sorted ranges <tt>[first1,last1)</tt> and
12227 <tt>[first2,last2)</tt> into the range
12228 <del><tt>[result,result + (last1 - first1) + (last2 - first2))</tt></del>
12229 <ins><tt>[result, last)</tt> (where <tt>last</tt> is equal to <tt>result + (last1
12230 - first1) + (last2 - first2))</tt>, such that resulting range will be
12231 sorted in non-decreasing order; that is, for every iterator <tt>i</tt> in
12232 <tt>[result,last)</tt> other than <tt>result</tt>, the condition <tt>*i < *(i - 1)</tt> or,
12233 respectively, <tt>comp(*i, *(i - 1))</tt> will be false</ins>.
12237 <ins><i>Requires:</i></ins> The resulting range shall not overlap with either of the original ranges. <del>The list will be sorted in non-decreasing
12238 order according to the ordering defined by <tt>comp</tt>; that is, for every iterator <tt>i</tt> in
12239 <tt>[first,last)</tt> other than <tt>first</tt>, the condition <tt>*i < *(i - 1)</tt> or
12240 <tt>comp(*i, *(i - 1))</tt> will be false.</del> <ins>The results of the expressions <tt>*first1</tt> and <tt>*first2</tt>
12241 shall be writable to the output iterator.</ins>
12246 [N.B.: I attempted to reuse the wording style of <tt>inplace_merge</tt>,
12247 therefore proposing to
12248 insert ", respectively," between both predicate tests. This is no
12249 strictly necessary as
12250 other parts of <tt><algorithm></tt> show, just a matter of consistency]
12259 <h3><a name="785"></a>785. Random Number Requirements in TR1</h3>
12260 <p><b>Section:</b> TR1 5.1.4.5 [tr.rand.eng.disc], TR1 5.1.4.6 [tr.rand.eng.xor] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
12261 <b>Submitter:</b> John Maddock <b>Date:</b> 2008-01-15</p>
12262 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
12263 <p><b>Discussion:</b></p>
12265 Table 16 of TR1 requires that all Pseudo Random Number generators have a
12268 <blockquote><pre>seed(integer-type s)
12269 </pre></blockquote>
12272 member function that is equivalent to:
12275 <blockquote><pre>mygen = Generator(s)
12276 </pre></blockquote>
12279 But the generators <tt>xor_combine</tt> and <tt>discard_block</tt> have no such seed member, only the
12282 <blockquote><pre>template <class Gen>
12284 </pre></blockquote>
12287 member, which will not accept an integer literal as an argument: something that appears to violate the intent of Table 16.
12291 So... is this a bug in TR1?
12294 <p>This is a real issue BTW, since the Boost implementation does adhere
12295 to the requirements of Table 16, while at least one commercial
12296 implementation does not and follows a strict adherence to sections
12297 5.1.4.5 and 5.1.4.6 instead.
12306 Both engines do have the necessary
12307 constructor, therefore the omission of the <tt>seed()</tt> member
12308 functions appears to be an oversight.
12313 <p><b>Proposed resolution:</b></p>
12322 <h3><a name="787"></a>787. complexity of <tt>binary_search</tt></h3>
12323 <p><b>Section:</b> 25.3.3.4 [binary.search] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
12324 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2007-09-08</p>
12325 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
12326 <p><b>Discussion:</b></p>
12328 In 25.3.3.4 [binary.search]/3 the complexity of <tt>binary_search</tt> is described as
12332 At most <tt>log(last - first) + 2</tt> comparisons.
12336 This should be precised and brought in line with the nomenclature used for
12337 <tt>lower_bound</tt>, <tt>upper_bound</tt>, and <tt>equal_range</tt>.
12341 All existing libraries I'm aware of, delegate to
12342 <tt>lower_bound</tt> (+ one further comparison). Since
12343 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#384">384</a>
12344 has now WP status, the resolution of #787 should
12345 be brought in-line with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#384">384</a> by changing the <tt>+ 2</tt>
12346 to <tt>+ O(1)</tt>.
12355 Alisdair prefers to apply an upper bound instead of O(1), but that would
12356 require fixing for <tt>lower_bound</tt>, <tt>upper_bound</tt> etc. as well. If he really
12357 cares about it, he'll send an issue to Howard.
12362 <p><b>Proposed resolution:</b></p>
12364 Change 25.3.3.4 [binary.search]/3
12368 <i>Complexity:</i> At most <tt>log<ins><sub>2</sub></ins>(last - first) + <del>2</del> <ins><i>O</i>(1)</ins></tt> comparisons.
12376 <h3><a name="788"></a>788. ambiguity in [istream.iterator]</h3>
12377 <p><b>Section:</b> 24.5.1 [istream.iterator] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
12378 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-02-06</p>
12379 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#istream.iterator">active issues</a> in [istream.iterator].</p>
12380 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#istream.iterator">issues</a> in [istream.iterator].</p>
12381 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
12382 <p><b>Discussion:</b></p>
12384 The description of how an istream_iterator object becomes an
12385 end-of-stream iterator is a) ambiguous and b) out of date WRT
12386 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#468">468</a>:
12390 <tt>istream_iterator</tt> reads (using <tt>operator>></tt>) successive elements from the
12391 input stream for which it was constructed. After it is constructed, and
12392 every time <tt>++</tt> is used, the iterator reads and stores a value of <tt>T</tt>. If
12393 the end of stream is reached (<tt>operator void*()</tt> on the stream returns
12394 <tt>false</tt>), the iterator becomes equal to the <i>end-of-stream</i> iterator value.
12395 The constructor with no arguments <tt>istream_iterator()</tt> always constructs
12396 an end of stream input iterator object, which is the only legitimate
12397 iterator to be used for the end condition. The result of <tt>operator*</tt> on an
12398 end of stream is not defined. For any other iterator value a <tt>const T&</tt> is
12399 returned. The result of <tt>operator-></tt> on an end of stream is not defined.
12400 For any other iterator value a <tt>const T*</tt> is returned. It is impossible to
12401 store things into istream iterators. The main peculiarity of the istream
12402 iterators is the fact that <tt>++</tt> operators are not equality preserving,
12403 that is, <tt>i == j</tt> does not guarantee at all that <tt>++i == ++j</tt>. Every time <tt>++</tt>
12404 is used a new value is read.
12408 <tt>istream::operator void*()</tt> returns null if <tt>istream::fail()</tt> is <tt>true</tt>,
12409 otherwise non-null. <tt>istream::fail()</tt> returns <tt>true</tt> if <tt>failbit</tt> or
12410 <tt>badbit</tt> is set in <tt>rdstate()</tt>. Reaching the end of stream doesn't
12411 necessarily imply that <tt>failbit</tt> or <tt>badbit</tt> is set (e.g., after
12412 extracting an <tt>int</tt> from <tt>stringstream("123")</tt> the stream object will
12413 have reached the end of stream but <tt>fail()</tt> is <tt>false</tt> and <tt>operator
12414 void*()</tt> will return a non-null value).
12418 Also I would prefer to be explicit about calling <tt>fail()</tt> here
12419 (there is no <tt>operator void*()</tt> anymore.)
12423 <p><b>Proposed resolution:</b></p>
12425 Change 24.5.1 [istream.iterator]/1:
12429 <tt>istream_iterator</tt> reads (using <tt>operator>></tt>) successive elements from the
12430 input stream for which it was constructed. After it is constructed, and
12431 every time <tt>++</tt> is used, the iterator reads and stores a value of <tt>T</tt>. If
12432 <del>the end of stream is reached</del> <ins>the iterator fails to read and store a value of <tt>T</tt></ins>
12433 (<tt><del>operator void*()</del> <ins>fail()</ins></tt> on the stream returns
12434 <tt><del>false</del> <ins>true</ins></tt>), the iterator becomes equal to the <i>end-of-stream</i> iterator value.
12435 The constructor with no arguments <tt>istream_iterator()</tt> always constructs
12436 an end of stream input iterator object, which is the only legitimate
12437 iterator to be used for the end condition. The result of <tt>operator*</tt> on an
12438 end of stream is not defined. For any other iterator value a <tt>const T&</tt> is
12439 returned. The result of <tt>operator-></tt> on an end of stream is not defined.
12440 For any other iterator value a <tt>const T*</tt> is returned. It is impossible to
12441 store things into istream iterators. The main peculiarity of the istream
12442 iterators is the fact that <tt>++</tt> operators are not equality preserving,
12443 that is, <tt>i == j</tt> does not guarantee at all that <tt>++i == ++j</tt>. Every time <tt>++</tt>
12444 is used a new value is read.
12452 <h3><a name="793"></a>793. <tt>discrete_distribution</tt> missing constructor</h3>
12453 <p><b>Section:</b> 26.4.8.5.1 [rand.dist.samp.discrete] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
12454 <b>Submitter:</b> P.J. Plauger <b>Date:</b> 2008-02-09</p>
12455 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#rand.dist.samp.discrete">active issues</a> in [rand.dist.samp.discrete].</p>
12456 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.dist.samp.discrete">issues</a> in [rand.dist.samp.discrete].</p>
12457 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
12458 <p><b>Discussion:</b></p>
12460 <tt>discrete_distribution</tt> should have a constructor like:
12463 <blockquote><pre>template<class _Fn>
12464 discrete_distribution(result_type _Count, double _Low, double _High,
12466 </pre></blockquote>
12469 (Makes it easier to fill a histogram with function values over a range.)
12478 How do you specify the function so that it does not return negative
12479 values? If you do it is a bad construction. This requirement is already
12480 there. Where in each bin does one evaluate the function? In the middle.
12481 Need to revisit tomorrow.
12491 Bill is not requesting this.
12494 Marc Paterno: <tt>_Fn</tt> cannot return negative values at the points where the
12495 function is sampled. It is sampled in the middle of each bin. <tt>_Fn</tt> cannot
12496 return 0 everywhere it is sampled.
12499 Jens: lambda expressions are rvalues
12502 Add a library issue to provide an
12503 <tt>initializer_list<double></tt> constructor for
12504 <tt>discrete_distribution</tt>.
12507 Marc Paterno: dislikes reference for <tt>_Fn</tt> parameter. Make it pass-by-value (to use lambda),
12508 use <tt>std::ref</tt> to wrap giant-state function objects.
12511 Daniel: See <tt>random_shuffle</tt>, pass-by-rvalue-reference.
12514 Daniel to draft wording.
12519 Pre San Francisco, Daniel provided wording:
12524 The here proposed changes of the WP refer to the current state of
12525 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2691.pdf">N2691</a>.
12526 During the Sophia Antipolis meeting two different proposals came up
12527 regarding the functor argument type, either by value or by rvalue-reference.
12528 For consistence with existing conventions (state-free algorithms and the
12529 <tt>general_pdf_distribution</tt> c'tor signature) the author decided to propose a
12530 function argument that is provided by value. If severe concerns exists that
12531 stateful functions would be of dominant relevance, it should be possible to
12532 replace the two occurrences of <tt>Func</tt> by <tt>Func&&</tt> in this proposal as part
12533 of an editorial process.
12538 <p><b>Proposed resolution:</b></p>
12542 In 26.4.8.5.1 [rand.dist.samp.discrete]/1, class <tt>discrete_distribution</tt>, just
12543 <em>before</em> the member declaration
12546 <blockquote><pre>explicit discrete_distribution(const param_type& parm);
12547 </pre></blockquote>
12554 <blockquote><pre>template<typename Func>
12555 discrete_distribution(result_type nf, double xmin, double xmax, Func fw);
12556 </pre></blockquote>
12561 Between p.4 and p.5 insert a series of new paragraphs as part of the
12562 new member description::
12564 <blockquote><pre>template<typename Func>
12565 discrete_distribution(result_type nf, double xmin, double xmax, Func fw);
12569 <i>Complexity:</i> Exactly nf invocations of fw.
12576 fw shall be callable with one argument of type double, and shall
12577 return values of a type convertible to double;</li>
12579 <li>If nf > 0, the relation <tt><i>x</i><sub><i>min</i></sub></tt> < <tt><i>x</i><sub><i>max</i></sub></tt> shall hold, and for all sample values
12580 <tt><i>x</i><sub><i>k</i></sub></tt>, fw(<tt><i>x</i><sub><i>k</i></sub></tt>) shall return a weight value <tt><i>w</i><sub><i>k</i></sub></tt> that is non-negative, non-NaN,
12581 and non-infinity;</li>
12583 <li>The following relations shall hold: nf ≥ 0, and 0 < S = <tt><i>w</i><sub><i>0</i></sub></tt>+. . .+<tt><i>w<sub>n-1</sub></i></tt>.</li>
12591 <li>If nf == 0, sets n = 1 and lets the sequence w have length n = 1 and
12592 consist of the single value <tt><i>w</i><sub><i>0</i></sub></tt> = 1.</li>
12595 <p>Otherwise, sets n = nf, deltax = (<tt><i>x</i><sub><i>max</i></sub></tt> - <tt><i>x</i><sub><i>min</i></sub></tt>)/n and <tt><i>x</i><sub><i>cent</i></sub></tt> = <tt><i>x</i><sub><i>min</i></sub></tt> +
12597 <blockquote><pre>For each k = 0, . . . ,n-1, calculates:
12598 <tt><i>x</i><sub><i>k</i></sub></tt> = <tt><i>x</i><sub><i>cent</i></sub></tt> + k * deltax
12599 <tt><i>w</i><sub><i>k</i></sub></tt> = fw(<tt><i>x</i><sub><i>k</i></sub></tt>)
12600 </pre></blockquote>
12603 <p>Constructs a discrete_distribution object with probabilities:</p>
12604 <blockquote><pre><tt><i>p</i><sub><i>k</i></sub></tt> = <tt><i>w</i><sub><i>k</i></sub></tt>/S for k = 0, . . . , n-1.
12605 </pre></blockquote>
12617 <h3><a name="794"></a>794. <tt>piecewise_constant_distribution</tt> missing constructor</h3>
12618 <p><b>Section:</b> 26.4.8.5.2 [rand.dist.samp.pconst] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
12619 <b>Submitter:</b> P.J. Plauger <b>Date:</b> 2008-02-09</p>
12620 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#rand.dist.samp.pconst">active issues</a> in [rand.dist.samp.pconst].</p>
12621 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.dist.samp.pconst">issues</a> in [rand.dist.samp.pconst].</p>
12622 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
12623 <p><b>Discussion:</b></p>
12625 <tt>piecewise_constant_distribution</tt> should have a constructor like:
12628 <blockquote><pre>template<class _Fn>
12629 piecewise_constant_distribution(size_t _Count,
12630 _Ty _Low, _Ty _High, _Fn& _Func);
12631 </pre></blockquote>
12634 (Makes it easier to fill a histogram with function values over a range.
12635 The two (reference <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#793">793</a>) make a sensible replacement for
12636 <tt>general_pdf_distribution</tt>.)
12646 Marc: uses variable width of bins and weight for each bin. This is not
12647 giving enough flexibility to control both variables.
12650 Add a library issue to provide an constructor taking an
12651 <tt>initializer_list<double></tt> and <tt>_Fn</tt> for <tt>piecewise_constant_distribution</tt>.
12654 Daniel to draft wording.
12659 Pre San Francisco, Daniel provided wording.
12664 The here proposed changes of the WP refer to the current state of
12665 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2691.pdf">N2691</a>.
12666 For reasons explained in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#793">793</a>, the author decided to propose a function
12667 argument that is provided by value. The issue proposes a c'tor signature,
12668 that does not take advantage of the full flexibility of
12669 <tt>piecewise_constant_distribution</tt>,
12670 because it restricts on a constant bin width, but the use-case seems to
12671 be popular enough to justify it's introduction.
12676 <p><b>Proposed resolution:</b></p>
12681 In 26.4.8.5.2 [rand.dist.samp.pconst]/1, class <tt>piecewise_constant_distribution</tt>,
12682 just <em>before</em> the member declaration
12685 <blockquote><pre>explicit piecewise_constant_distribution(const param_type& parm);
12686 </pre></blockquote>
12690 <blockquote><pre>template<typename Func>
12691 piecewise_constant_distribution(size_t nf, RealType xmin, RealType xmax, Func fw);
12692 </pre></blockquote>
12697 Between p.4 and p.5 insert a new sequence of paragraphs nominated
12698 below as [p5_1], [p5_2],
12699 [p5_3], and [p5_4] as part of the new member description:
12702 <blockquote><pre>template<typename Func>
12703 piecewise_constant_distribution(size_t nf, RealType xmin, RealType xmax, Func fw);
12707 [p5_1] <i>Complexity:</i> Exactly <tt>nf</tt> invocations of <tt>fw</tt>.
12710 [p5_2] <i>Requires:</i>
12713 <li><tt>fw</tt> shall be callable with one argument of type <tt>RealType</tt>, and shall
12714 return values of a type convertible to double;
12717 For all sample values <tt><i>x<sub>k</sub></i></tt> defined below, fw(<tt><i>x<sub>k</sub></i></tt>) shall return a weight
12718 value <tt><i>w<sub>k</sub></i></tt> that is non-negative, non-NaN, and non-infinity;
12721 The following relations shall hold: <tt><i>x<sub>min</sub></i></tt> < <tt><i>x<sub>max</sub></i></tt>, and
12722 0 < S = <tt><i>w<sub>0</sub></i></tt>+. . .+<tt><i>w<sub>n-1</sub></i></tt>.
12726 [p5_3] <i>Effects:</i>
12733 sets deltax = <tt><i>x<sub>max</sub></i></tt> - <tt><i>x<sub>min</sub></i></tt>, and</li>
12734 <li> lets the sequence <tt>w</tt> have length <tt>n = 1</tt> and consist of the single
12735 value <tt><i>w<sub>0</sub></i></tt> = 1, and</li>
12736 <li> lets the sequence <tt>b</tt> have length <tt>n+1</tt> with <tt><i>b<sub>0</sub></i></tt> = <tt><i>x<sub>min</sub></i></tt> and
12737 <tt><i>b<sub>1</sub></i></tt> = <tt><i>x<sub>max</sub></i></tt>
12744 <li> sets <tt>n = nf</tt>, <tt>deltax = </tt>(<tt><i>x<sub>max</sub></i></tt> - <tt><i>x<sub>min</sub></i></tt>)/n,
12745 <tt><i>x<sub>cent</sub></i></tt> = <tt><i>x<sub>min</sub></i></tt> + 0.5 * deltax, and
12747 <li><p>lets the sequences <tt>w</tt> and <tt>b</tt> have length <tt>n</tt> and <tt>n+1</tt>, resp. and</p>
12748 <blockquote><pre>for each k = 0, . . . ,n-1, calculates:
12749 <tt><i>dx<sub>k</sub></i></tt> = k * deltax
12750 <tt><i>b<sub>k</sub></i></tt> = <tt><i>x<sub>min</sub></i></tt> + <tt><i>dx<sub>k</sub></i></tt>
12751 <tt><i>x<sub>k</sub></i></tt> = <tt><i>x<sub>cent</sub></i></tt> + <tt><i>dx<sub>k</sub></i></tt>
12752 <tt><i>w<sub>k</sub></i></tt> = fw(<tt><i>x<sub>k</sub></i></tt>),
12753 </pre></blockquote>
12756 <li> sets <tt><i>b<sub>n</sub></i></tt> = <tt><i>x<sub>max</sub></i></tt></li>
12761 Constructs a <tt>piecewise_constant_distribution</tt> object with
12762 the above computed sequence <tt>b</tt> as the interval boundaries
12763 and with the probability densities:
12765 <blockquote><pre><tt><i>ρ<sub>k</sub></i></tt> = <tt><i>w<sub>k</sub></i></tt>/(S * deltax) for k = 0, . . . , n-1.
12766 </pre></blockquote>
12770 [p5_4] <i>Remarks:</i> In this context, the subintervals [<tt><i>b<sub>k</sub></i></tt>, <tt><i>b<sub>k+1</sub></i></tt>) are commonly
12771 known as the <i>bins</i> of a histogram.
12784 <h3><a name="800"></a>800. Issues in 26.4.7.1 [rand.util.seedseq](6)</h3>
12785 <p><b>Section:</b> 26.4.7.1 [rand.util.seedseq] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
12786 <b>Submitter:</b> Stephan Tolksdorf <b>Date:</b> 2008-02-18</p>
12787 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#rand.util.seedseq">active issues</a> in [rand.util.seedseq].</p>
12788 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.util.seedseq">issues</a> in [rand.util.seedseq].</p>
12789 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
12790 <p><b>Discussion:</b></p>
12792 The for-loop in the algorithm specification has <tt>n</tt> iterations, where <tt>n</tt> is
12793 defined to be <tt>end - begin</tt>, i.e. the number of supplied w-bit quantities.
12794 Previous versions of this algorithm and the general logic behind it
12795 suggest that this is an oversight and that in the context of the
12796 for-loop <tt>n</tt> should be the number of full 32-bit quantities in <tt>b</tt> (rounded
12797 upwards). If <tt>w</tt> is 64, the current algorithm throws away half of all bits
12798 in <tt>b</tt>. If <tt>w</tt> is 16, the current algorithm sets half of all elements in <tt>v</tt>
12803 There are two more minor issues:
12808 Strictly speaking <tt>end - begin</tt> is not defined since
12809 <tt>InputIterator</tt> is not required to be a random access iterator.
12812 Currently all integral types are allowed as input to the <tt>seed_seq</tt>
12813 constructor, including <tt>bool</tt>. IMHO allowing <tt>bool</tt>s unnecessarily
12814 complicates the implementation without any real benefit to the user.
12815 I'd suggest to exclude <tt>bool</tt>s as input.
12825 Move to OPEN Bill will try to propose a resolution by the next meeting.
12829 post Bellevue: Bill provided wording.
12834 This issue is made moot if <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#803">803</a> is accepted.
12839 <p><b>Proposed resolution:</b></p>
12841 Replace 26.4.7.1 [rand.util.seedseq] paragraph 6 with:
12846 <i>Effects:</i> Constructs a <tt>seed_seq</tt> object by effectively concatenating the
12847 low-order <tt>u</tt> bits of each of the elements of the supplied sequence <tt>[begin,
12849 in ascending order of significance to make a (possibly very large) unsigned
12850 binary number <tt>b</tt> having a total of <tt>n</tt> bits, and then carrying out the
12855 <blockquote><pre>for( v.clear(); n > 0; n -= 32 )
12856 v.push_back(b mod 2<sup>32</sup>), b /= 2<sup>32</sup>;
12857 </pre></blockquote>
12865 <h3><a name="801"></a>801. <tt>tuple</tt> and <tt>pair</tt> trivial members</h3>
12866 <p><b>Section:</b> 20.4 [tuple] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
12867 <b>Submitter:</b> Lawrence Crowl <b>Date:</b> 2008-02-18</p>
12868 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#tuple">active issues</a> in [tuple].</p>
12869 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple">issues</a> in [tuple].</p>
12870 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
12871 <p><b>Discussion:</b></p>
12873 Classes with trivial special member functions are inherently more
12874 efficient than classes without such functions. This efficiency is
12875 particularly pronounced on modern ABIs that can pass small classes
12876 in registers. Examples include value classes such as complex numbers
12877 and floating-point intervals. Perhaps more important, though, are
12878 classes that are simple collections, like <tt>pair</tt> and <tt>tuple</tt>. When the
12879 parameter types of these classes are trivial, the <tt>pair</tt>s and <tt>tuple</tt>s
12880 themselves can be trivial, leading to substantial performance wins.
12883 The current working draft make specification of trivial functions
12884 (where possible) much easer through <tt>default</tt>ed and <tt>delete</tt>d functions.
12885 As long as the semantics of defaulted and deleted functions match
12886 the intended semantics, specification of defaulted and deleted
12887 functions will yield more efficient programs.
12890 There are at least two cases where specification of an explicitly
12891 defaulted function may be desirable.
12894 First, the <tt>std::pair</tt> template has a non-trivial default constructor,
12895 which prevents static initialization of the pair even when the
12896 types are statically initializable. Changing the definition to
12899 <blockquote><pre>pair() = default;
12900 </pre></blockquote>
12903 would enable such initialization. Unfortunately, the change is
12904 not semantically neutral in that the current definition effectively
12905 forces value initialization whereas the change would not value
12906 initialize in some contexts.
12910 ** Does the committee confirm that forced value initialization
12911 was the intent? If not, does the committee wish to change the
12912 behavior of <tt>std::pair</tt> in C++0x?
12915 Second, the same default constructor issue applies to <tt>std::tuple</tt>.
12916 Furthermore, the <tt>tuple</tt> copy constructor is current non-trivial,
12917 which effectively prevents passing it in registers. To enable
12918 passing <tt>tuples</tt> in registers, the copy constructor should be
12919 make explicitly <tt>default</tt>ed. The new declarations are:
12922 <blockquote><pre>tuple() = default;
12923 tuple(const tuple&) = default;
12924 </pre></blockquote>
12927 This changes is not implementation neutral. In particular, it
12928 prevents implementations based on pointers to the parameter
12929 types. It does however, permit implementations using the
12930 parameter types as bases.
12933 ** How does the committee wish to trade implementation
12934 efficiency versus implementation flexibility?
12944 General agreement; the first half of the issue is NAD.
12947 Before voting on the second half, it was agreed that a "Strongly Favor"
12948 vote meant support for trivial tuples (assuming usual requirements met),
12949 even at the expense of other desired qualities. A "Weakly Favor" vote
12950 meant support only if not at the expense of other desired qualities.
12953 Concensus: Go forward, but not at expense of other desired qualities.
12956 It was agreed to Alisdair should fold this work in with his other
12957 pair/tuple action items, above, and that issue 801 should be "open", but
12958 tabled until Alisdair's proposals are disposed of.
12963 <p><b>Proposed resolution:</b></p>
12972 <h3><a name="803"></a>803. Simplification of <tt>seed_seq::seq_seq</tt></h3>
12973 <p><b>Section:</b> 26.4.7.1 [rand.util.seedseq] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
12974 <b>Submitter:</b> Charles Karney <b>Date:</b> 2008-02-22</p>
12975 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#rand.util.seedseq">active issues</a> in [rand.util.seedseq].</p>
12976 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.util.seedseq">issues</a> in [rand.util.seedseq].</p>
12977 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
12978 <p><b>Discussion:</b></p>
12980 <tt>seed_seq(InputIterator begin, InputIterator end);</tt> constructs a <tt>seed_seq</tt>
12981 object repacking the bits of supplied sequence <tt>[begin, end)</tt> into a
12985 This repacking triggers several problems:
12989 Distinctness of the output of <tt>seed_seq::generate</tt> required the
12990 introduction of the initial "<tt>if (w < 32) v.push_back(n);</tt>" (Otherwise
12991 the unsigned short vectors [1, 0] and [1] generate the same sequence.)
12994 Portability demanded the introduction of the template parameter <tt>u</tt>.
12995 (Otherwise some sequences could not be obtained on computers where no
12996 integer types are exactly 32-bits wide.)
12999 The description and algorithm have become unduly complicated.
13003 I propose simplifying this <tt>seed_seq</tt> constructor to be "32-bit only".
13004 Despite it's being simpler, there is NO loss of functionality (see
13008 Here's how the description would read
13012 26.4.7.1 [rand.util.seedseq] Class <tt>seed_seq</tt>
13016 <pre>template<class InputIterator>
13017 seed_seq(InputIterator begin, InputIterator end);
13021 5 <i>Requires:</i> NO CHANGE
13024 6 <i>Effects:</i> Constructs a <tt>seed_seq</tt> object by
13027 <pre>for (InputIterator s = begin; s != end; ++s)
13028 v.push_back((*s) mod 2^32);
13039 The chief virtues here are simplicity, portability, and generality.
13043 Simplicity -- compare the above specification with the
13044 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf">n2461</a> proposal.
13047 Portability -- with <tt>iterator_traits<InputIterator>::value_type =
13048 uint_least32_t</tt> the user is guaranteed to get the same behavior across
13052 Generality -- any behavior that the
13053 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf">n2461</a>
13054 proposal can achieve can be
13055 obtained with this simpler proposal (albeit with a shuffling of bits
13056 in the input sequence).
13060 Arguments (and counter-arguments) against making this change (and
13062 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf">n2461</a>
13068 The user can pass an array of <tt>unsigned char</tt> and <tt>seed_seq</tt> will nicely
13072 Response: So what? Consider the seed string "ABC". The
13073 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf">n2461</a>
13074 proposal results in
13076 <blockquote><pre>v = { 0x3, 0x434241 };
13077 </pre></blockquote>
13079 while the simplified proposal yields
13081 <blockquote><pre>v = { 0x41, 0x42, 0x43 };
13082 </pre></blockquote>
13084 The results produced by <tt>seed_seq::generate</tt> with the two inputs are
13085 different but nevertheless equivalently "mixed up" and this remains
13086 true even if the seed string is long.
13091 With long strings (e.g., with bit-length comparable to the number of
13092 bits in the state), <tt>v</tt> is longer (by a factor of 4) with the simplified
13093 proposal and <tt>seed_seq::generate</tt> will be slower.
13096 Response: It's unlikely that the efficiency of <tt>seed_seq::generate</tt> will
13097 be a big issue. If it is, the user is free to repack the seed vector
13098 before constructing <tt>seed_seq</tt>.
13103 A user can pass an array of 64-bit integers and all the bits will be
13107 Response: Indeed. However, there are many instances in the
13108 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf">n2461</a>
13109 where integers are silently coerced to a narrower width and this
13110 should just be a case of the user needing to read the documentation.
13111 The user can of course get equivalent behavior by repacking his seed
13112 into 32-bit pieces. Furthermore, the unportability of the
13113 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf">n2461</a>
13116 <blockquote><pre>unsigned long s[] = {1, 2, 3, 4};
13117 seed_seq q(s, s+4);
13118 </pre></blockquote>
13120 which typically results in <tt>v = {1, 2, 3, 4}</tt> on 32-bit machines and in
13121 <tt>v = {1, 0, 2, 0, 3, 0, 4, 0}</tt> on 64-bit machines is a major pitfall for
13122 unsuspecting users.
13128 Note: this proposal renders moot issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#782">782</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#800">800</a>.
13137 Walter needs to ask Fermilab for guidance. Defer till tomorrow. Bill likes the proposed resolution.
13147 Marc Paterno wants portable behavior between 32bit and 64bit machines;
13148 we've gone to significant trouble to support portability of engines and
13152 Jens: the new algorithm looks perfectly portable
13155 Marc Paterno to review off-line.
13158 Modify the proposed resolution to read "Constructs a seed_seq object by the following algorithm ..."
13161 Disposition: move to review; unanimous consent.
13164 (moots <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#782">782</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#800">800</a>)
13170 <p><b>Proposed resolution:</b></p>
13172 Change 26.4.7.1 [rand.util.seedseq]:
13176 <pre>template<class InputIterator<del>,
13177 size_t u = numeric_limits<iterator_traits<InputIterator>::value_type>::digits</del>>
13178 seed_seq(InputIterator begin, InputIterator end);
13182 -5- <i>Requires:</i> <tt>InputIterator</tt> shall satisfy the requirements of an input iterator (24.1.1)
13183 such that <tt>iterator_traits<InputIterator>::value_type</tt> shall denote an integral type.
13186 -6- Constructs a <tt>seed_seq</tt> object by <ins>the following algorithm</ins> <del>rearranging some or all of the bits of the supplied sequence
13187 <tt>[begin,end)</tt> of w-bit quantities into 32-bit units, as if by the following: </del>
13190 <del>First extract the rightmost <tt>u</tt> bits from each of the <tt>n = end
13191 - begin</tt> elements of the supplied sequence and concatenate all the
13192 extracted bits to initialize a single (possibly very large) unsigned
13193 binary number, <tt>b = ∑<sup>n-1</sup><sub>i=0</sub> (begin[i]
13194 mod 2<sup>u</sup>) · 2<sup>w·i</sup></tt> (in which the bits of each <tt>begin[i]</tt>
13195 are treated as denoting an unsigned quantity). Then carry out
13196 the following algorithm:</del>
13198 <blockquote><pre><del>
13202 for( ; $n$ > 0; --$n$)
13203 v.push_back(b mod 2<sup>32</sup>), b /= 2<sup>32</sup>;
13204 </del></pre></blockquote>
13207 for (InputIterator s = begin; s != end; ++s)
13208 v.push_back((*s) mod 2<sup>32</sup>);
13219 <h3><a name="804"></a>804. Some problems with classes <tt>error_code</tt>/<tt>error_condition</tt></h3>
13220 <p><b>Section:</b> 19.4 [syserr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
13221 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-02-24</p>
13222 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#syserr">active issues</a> in [syserr].</p>
13223 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#syserr">issues</a> in [syserr].</p>
13224 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
13225 <p><b>Discussion:</b></p>
13229 19.4.2.1 [syserr.errcode.overview]/1, class <tt>error_code</tt> and
13230 19.4.3.1 [syserr.errcondition.overview]/, class <tt>error_condition</tt> synopses
13231 declare an expository data member <tt>cat_</tt>:
13233 <blockquote><pre>const error_category& cat_; // exposition only
13234 </pre></blockquote>
13236 which is used to define the semantics of several members. The decision
13237 to use a member of reference type lead to several problems:
13241 The classes are not <tt>(Copy)Assignable</tt>, which is probably not the intent.
13244 The post conditions of all modifiers from
13245 19.4.2.3 [syserr.errcode.modifiers] and 19.4.3.3 [syserr.errcondition.modifiers], resp.,
13246 cannot be fulfilled.
13250 The simple fix would be to replace the reference by a pointer member.
13255 I would like to give the editorial remark that in both classes the
13256 constrained <tt>operator=</tt>
13257 overload (template with <tt>ErrorCodeEnum</tt> argument) makes in invalid
13258 usage of <tt>std::enable_if</tt>: By using the default value for the second <tt>enable_if</tt>
13259 parameter the return type would be defined to be <tt>void&</tt> even in otherwise
13260 valid circumstances - this return type must be explicitly provided (In
13261 <tt>error_condition</tt> the first declaration uses an explicit value, but of wrong
13266 The member function <tt>message</tt> throws clauses (
13267 19.4.1.2 [syserr.errcat.virtuals]/10, 19.4.2.4 [syserr.errcode.observers]/8, and
13268 19.4.3.4 [syserr.errcondition.observers]/6) guarantee "throws nothing",
13270 they return a <tt>std::string</tt> by value, which might throw in out-of-memory
13271 conditions (see related issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#771">771</a>).
13282 Part A: NAD (editorial), cleared by the resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#832">832</a>.
13285 Part B: Technically correct, save for typo. Rendered moot by the concept proposal
13286 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2620.html">N2620</a>) NAD (editorial).
13289 Part C: We agree; this is consistent with the resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#721">721</a>.
13292 Howard: please ping Beman, asking him to clear away parts A and B from
13293 the wording in the proposed resolution, so it is clear to the editor
13294 what needs to be applied to the working paper.
13297 Beman provided updated wording. Since issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#832">832</a> is not going
13298 forward, the provided wording includes resolution of part A.
13304 <p><b>Proposed resolution:</b></p>
13307 Resolution of part A:
13311 Change 19.4.2.1 [syserr.errcode.overview] Class error_code overview synopsis as indicated:
13314 <blockquote><pre>private:
13315 int val_; // exposition only
13316 const error_category<del>&</del><ins>*</ins> cat_; // exposition only
13317 </pre></blockquote>
13320 Change 19.4.2.2 [syserr.errcode.constructors] Class error_code constructors as indicated:
13328 <i>Effects:</i> Constructs an object of type <tt>error_code</tt>.
13331 <i>Postconditions:</i> <tt>val_ == 0</tt> and <tt>cat_ == <ins>&</ins>system_category</tt>.
13334 <i>Throws:</i> Nothing.
13337 <pre>error_code(int val, const error_category& cat);
13341 <i>Effects:</i> Constructs an object of type <tt>error_code</tt>.
13344 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == <ins>&</ins>cat</tt>.
13347 <i>Throws:</i> Nothing.
13353 Change 19.4.2.3 [syserr.errcode.modifiers] Class error_code modifiers as indicated:
13357 <pre>void assign(int val, const error_category& cat);
13361 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == <ins>&</ins>cat</tt>.
13364 <i>Throws:</i> Nothing.
13370 Change 19.4.2.4 [syserr.errcode.observers] Class error_code observers as indicated:
13374 const error_category& category() const;
13377 <i>Returns:</i> <tt><ins>*</ins>cat_</tt>.
13380 <i>Throws:</i> Nothing.
13386 Change 19.4.3.1 [syserr.errcondition.overview] Class error_condition overview synopsis as indicated:
13389 <blockquote><pre>private:
13390 int val_; // exposition only
13391 const error_category<del>&</del><ins>*</ins> cat_; // exposition only
13392 </pre></blockquote>
13395 Change 19.4.3.2 [syserr.errcondition.constructors] Class error_condition constructors as indicated:
13398 (If the proposed resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#805">805</a> has already been applied, the
13399 name <tt>posix_category</tt> will have been changed to <tt>generic_category</tt>. That has
13400 no effect on this resolution.)
13405 <pre>error_condition();
13409 <i>Effects:</i> Constructs an object of type <tt>error_condition</tt>.
13412 <i>Postconditions:</i> <tt>val_ == 0</tt> and <tt>cat_ == <ins>&</ins>posix_category</tt>.
13415 <i>Throws:</i> Nothing.
13418 <pre>error_condition(int val, const error_category& cat);
13422 <i>Effects:</i> Constructs an object of type <tt>error_condition</tt>.
13425 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == <ins>&</ins>cat</tt>.
13428 <i>Throws:</i> Nothing.
13434 Change 19.4.3.3 [syserr.errcondition.modifiers] Class error_condition modifiers as indicated:
13438 void assign(int val, const error_category& cat);
13441 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == <ins>&</ins>cat</tt>.
13444 <i>Throws:</i> Nothing.
13450 Change 19.4.3.4 [syserr.errcondition.observers] Class error_condition observers as indicated:
13454 const error_category& category() const;
13457 <i>Returns:</i> <tt><ins>*</ins>cat_</tt>.
13460 <i>Throws:</i> Nothing.
13467 Resolution of part C:
13473 In 19.4.1.2 [syserr.errcat.virtuals], remove the throws clause p. 10.
13477 <pre>virtual string message(int ev) const = 0;
13482 <i>Returns:</i> A string that describes the error condition denoted by <tt>ev</tt>.
13485 <del><i>Throws:</i> Nothing.</del>
13491 In 19.4.2.4 [syserr.errcode.observers], remove the throws clause p. 8.
13495 <pre>string message() const;
13499 <i>Returns:</i> <tt>category().message(value())</tt>.
13502 <del><i>Throws:</i> Nothing.</del>
13508 In 19.4.3.4 [syserr.errcondition.observers], remove the throws clause p. 6.
13512 <pre>string message() const;
13516 <i>Returns:</i> <tt>category().message(value())</tt>.
13519 <del><i>Throws:</i> Nothing.</del>
13532 <h3><a name="805"></a>805. <tt>posix_error::posix_errno</tt> concerns</h3>
13533 <p><b>Section:</b> 19.4 [syserr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
13534 <b>Submitter:</b> Jens Maurer <b>Date:</b> 2008-02-24</p>
13535 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#syserr">active issues</a> in [syserr].</p>
13536 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#syserr">issues</a> in [syserr].</p>
13537 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
13538 <p><b>Discussion:</b></p>
13543 <blockquote><pre>namespace posix_error {
13545 address_family_not_supported, // EAFNOSUPPORT
13547 </pre></blockquote>
13550 should rather use the new scoped-enum facility (7.2 [dcl.enum]),
13551 which would avoid the necessity for a new <tt>posix_error</tt>
13552 namespace, if I understand correctly.
13556 Further discussion:
13562 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf">N2347</a>,
13563 Strongly Typed Enums, since renamed Scoped Enums.
13566 Alberto Ganesh Barbati also raised this issue in private email, and also proposed the scoped-enum solution.
13569 Nick Stoughton asked in Bellevue that <tt>posix_error</tt> and <tt>posix_errno</tt> not be used as names. The LWG agreed.
13572 The wording for the Proposed resolution was provided by Beman Dawes.
13577 <p><b>Proposed resolution:</b></p>
13579 Change System error support 19.4 [syserr] as indicated:
13582 <blockquote><pre><del>namespace posix_error {</del>
13583 enum <del>posix_errno</del> <ins>class errc</ins> {
13584 address_family_not_supported, // EAFNOSUPPORT
13586 wrong_protocol_type, // EPROTOTYPE
13588 <del>} // namespace posix_error</del>
13590 template <> struct is_error_condition_enum<<del>posix_error::posix_errno</del> <ins>errc</ins>>
13591 : public true_type {}
13593 <del>namespace posix_error {</del>
13594 error_code make_error_code(<del>posix_errno</del> <ins>errc</ins> e);
13595 error_condition make_error_condition(<del>posix_errno</del> <ins>errc</ins> e);
13596 <del>} // namespace posix_error</del>
13597 </pre></blockquote>
13600 Change System error support 19.4 [syserr] :
13604 <del>The <tt>is_error_code_enum</tt> and <tt>is_error_condition_enum</tt> templates may be
13605 specialized for user-defined types to indicate that such a type is
13606 eligible for class <tt>error_code</tt> and class <tt>error_condition</tt> automatic
13607 conversions, respectively.</del>
13611 Change System error support 19.4 [syserr] and its subsections:
13617 remove all occurrences of <tt>posix_error::</tt>
13620 change all instances of <tt>posix_errno</tt> to <tt>errc</tt>
13623 change all instances of <tt>posix_category</tt> to <tt>generic_category</tt>
13626 change all instances of <tt>get_posix_category</tt> to <tt>get_generic_category</tt>
13632 Change Error category objects 19.4.1.5 [syserr.errcat.objects], paragraph 2:
13636 <i>Remarks:</i> The object's <tt>default_error_condition</tt> and equivalent virtual
13637 functions shall behave as specified for the class <tt>error_category</tt>. The
13638 object's name virtual function shall return a pointer to the string
13639 <del>"POSIX"</del> <ins>"GENERIC"</ins>.
13643 Change 19.4.2.5 [syserr.errcode.nonmembers] Class <tt>error_code</tt> non-member functions as indicated:
13647 <pre>error_code make_error_code(<del>posix_errno</del> <ins>errc</ins> e);
13651 <i>Returns:</i> <tt>error_code(<ins>static_cast<int>(</ins>e<ins>)</ins>, <del>posix</del><ins>generic</ins>_category)</tt>.
13656 Change 19.4.3.5 [syserr.errcondition.nonmembers] Class <tt>error_condition</tt> non-member functions as indicated:
13660 <pre>error_condition make_error_condition(<del>posix_errno</del> <ins>errc</ins> e);
13664 <i>Returns:</i> <tt>error_condition(<ins>static_cast<int>(</ins>e<ins>)</ins>, <del>posix</del><ins>generic</ins>_category)</tt>.
13670 <p><b>Rationale:</b></p>
13673 <th colspan="2">Names Considered</th>
13677 <td><tt>portable</tt></td>
13679 Too non-specific. Did not wish to reserve such a common word in
13680 namespace std. Not quite the right meaning, either.
13685 <td><tt>portable_error</tt></td>
13687 Too long. Explicit qualification is always required for scoped enums, so
13688 a short name is desirable. Not quite the right meaning, either. May be
13689 misleading because <tt>*_error</tt> in the std lib is usually an exception class
13695 <td><tt>std_error</tt></td>
13697 Fairly short, yet explicit. But in fully qualified names like
13698 <tt>std::std_error::not_enough_memory</tt>, the std_ would be unfortunate. Not
13699 quite the right meaning, either. May be misleading because <tt>*_error</tt> in
13700 the std lib is usually an exception class name.
13705 <td><tt>generic</tt></td>
13707 Short enough. The category could be <tt>generic_category</tt>. Fully qualified
13708 names like <tt>std::generic::not_enough_memory</tt> read well. Reserving in
13709 namespace std seems dicey.
13714 <td><tt>generic_error</tt></td>
13716 Longish. The category could be <tt>generic_category</tt>. Fully qualified names
13717 like <tt>std::generic_error::not_enough_memory</tt> read well. Misleading because
13718 <tt>*_error</tt> in the std lib is usually an exception class name.
13723 <td><tt>generic_err</tt></td>
13725 A bit less longish. The category could be <tt>generic_category</tt>. Fully
13726 qualified names like <tt>std::generic_err::not_enough_memory</tt> read well.
13731 <td><tt>gen_err</tt></td>
13733 Shorter still. The category could be <tt>generic_category</tt>. Fully qualified
13734 names like <tt>std::gen_err::not_enough_memory</tt> read well.
13739 <td><tt>generr</tt></td>
13741 Shorter still. The category could be <tt>generic_category</tt>. Fully qualified
13742 names like <tt>std::generr::not_enough_memory</tt> read well.
13747 <td><tt>error</tt></td>
13749 Shorter still. The category could be <tt>generic_category</tt>. Fully qualified
13750 names like <tt>std::error::not_enough_memory</tt> read well. Do we want to use
13751 this general a name?
13756 <td><tt>err</tt></td>
13758 Shorter still. The category could be <tt>generic_category</tt>. Fully qualified
13759 names like <tt>std::err::not_enough_memory</tt> read well. Although alone it
13760 looks odd as a name, given the existing <tt>errno</tt> and <tt>namespace std</tt> names,
13761 it seems fairly intuitive.
13762 Problem: <tt>err</tt> is used throughout the standard library as an argument name
13763 and in examples as a variable name; it seems too confusing to add yet
13764 another use of the name.
13769 <td><tt>errc</tt></td>
13771 Short enough. The "c" stands for "constant". The category could be
13772 <tt>generic_category</tt>. Fully qualified names like
13773 <tt>std::errc::not_enough_memory</tt> read well. Although alone it looks odd as a
13774 name, given the existing <tt>errno</tt> and <tt>namespace std</tt> names, it seems fairly
13775 intuitive. There are no uses of <tt>errc</tt> in the current C++ standard.
13785 <h3><a name="806"></a>806. <tt>unique_ptr::reset</tt> effects incorrect, too permissive</h3>
13786 <p><b>Section:</b> 20.7.11.2.5 [unique.ptr.single.modifiers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
13787 <b>Submitter:</b> Peter Dimov <b>Date:</b> 2008-03-13</p>
13788 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
13789 <p><b>Discussion:</b></p>
13791 <tt>void unique_ptr::reset(T* p = 0)</tt> is currently specified as:
13795 <i>Effects:</i> If <tt>p == get()</tt> there are no effects. Otherwise <tt>get_deleter()(get())</tt>.
13799 There are two problems with this. One, if <tt>get() == 0</tt> and <tt>p != 0</tt>, the
13800 deleter is called with a NULL pointer, and this is probably not what's
13801 intended (the destructor avoids calling the deleter with 0.)
13805 Two, the special check for <tt>get() == p</tt> is generally not needed and such a
13806 situation usually indicates an error in the client code, which is being
13807 masked. As a data point, <tt>boost::shared_ptr</tt> was changed to assert on such
13808 self-resets in 2001 and there were no complaints.
13812 One might think that self-resets are necessary for operator= to work; it's specified to perform
13815 <blockquote><pre>reset( u.release() );
13816 </pre></blockquote>
13819 and the self-assignment
13822 <blockquote><pre>p = move(p);
13823 </pre></blockquote>
13826 might appear to result in a self-reset. But it doesn't; the <tt>release()</tt> is
13827 performed first, zeroing the stored pointer. In other words, <tt>p.reset(
13828 q.release() )</tt> works even when <tt>p</tt> and <tt>q</tt> are the same <tt>unique_ptr</tt>, and there
13829 is no need to special-case <tt>p.reset( q.get() )</tt> to work in a similar
13830 scenario, as it definitely doesn't when <tt>p</tt> and <tt>q</tt> are separate.
13835 <p><b>Proposed resolution:</b></p>
13838 Change 20.7.11.2.5 [unique.ptr.single.modifiers]:
13842 <pre>void reset(T* p = 0);
13845 -4- <i>Effects:</i> If <tt><del>p ==</del> get()<ins> == 0</ins></tt> there are no effects. Otherwise <tt>get_deleter()(get())</tt>.
13850 Change 20.7.11.3.3 [unique.ptr.runtime.modifiers]:
13854 <pre>void reset(T* p = 0);
13859 -2- <i>Effects:</i> If <tt><del>p ==</del> get()<ins> == 0</ins></tt> there are no effects. Otherwise <tt>get_deleter()(get())</tt>.
13870 <h3><a name="807"></a>807. <tt>tuple</tt> construction should not fail unless its element's construction fails</h3>
13871 <p><b>Section:</b> 20.4.1.2 [tuple.cnstr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
13872 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2008-03-13</p>
13873 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
13874 <p><b>Discussion:</b></p>
13876 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#527">527</a> Added a throws clause to <tt>bind</tt> constructors. I believe the same throws clause
13877 should be added to <tt>tuple</tt> except it ought to take into account move constructors as well.
13881 <p><b>Proposed resolution:</b></p>
13883 Add to 20.4.1.2 [tuple.cnstr]:
13888 For each <tt>tuple</tt> constructor and assignment operator, an exception is thrown only if the construction
13889 or assignment of one of the types in <tt>Types</tt> throws an exception.
13898 <h3><a name="808"></a>808. [forward] incorrect redundant specification</h3>
13899 <p><b>Section:</b> 20.2.2 [forward] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
13900 <b>Submitter:</b> Jens Maurer <b>Date:</b> 2008-03-13</p>
13901 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#forward">active issues</a> in [forward].</p>
13902 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#forward">issues</a> in [forward].</p>
13903 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
13904 <p><b>Discussion:</b></p>
13909 <i>Return type:</i> If <tt>T</tt> is an lvalue-reference type, an lvalue; otherwise, an rvalue.
13913 First of all, lvalue-ness and rvalue-ness are properties of an expression,
13914 not of a type (see 3.10 [basic.lval]). Thus, the phrasing "Return type" is wrong.
13915 Second, the phrase says exactly what the core language wording says for
13916 folding references in 14.3.1 [temp.arg.type]/p4 and for function return values
13917 in 5.2.2 [expr.call]/p10. (If we feel the wording should be retained, it should
13918 at most be a note with cross-references to those sections.)
13921 The prose after the example talks about "forwarding as an <tt>int&</tt> (an lvalue)" etc.
13922 In my opinion, this is a category error: "<tt>int&</tt>" is a type, "lvalue" is a
13923 property of an expression, orthogonal to its type. (Btw, expressions cannot
13924 have reference type, ever.)
13930 Return type: an rvalue.
13933 is just wrong and also redundant.
13937 <p><b>Proposed resolution:</b></p>
13939 Change 20.2.2 [forward] as indicated:
13943 <pre>template <class T> T&& forward(typename identity<T>::type&& t);
13949 <del><i>Return type:</i> If <tt>T</tt> is an lvalue-reference type, an lvalue; otherwise, an rvalue.</del>
13953 -7- In the first call to <tt>factory</tt>, <tt>A1</tt> is deduced as <tt>int</tt>, so 2 is forwarded to <tt>A</tt>'s constructor
13954 as <del>an <tt>int&&</tt> (</del>an rvalue<del>)</del>. In the second call to factory, <tt>A1</tt> is deduced
13955 as <tt>int&</tt>, so <tt>i</tt> is forwarded to <tt>A</tt>'s constructor as <del>an <tt>int&</tt> (</del>an lvalue<del>)</del>.
13956 In both cases, <tt>A2</tt> is deduced as double, so 1.414 is forwarded to <tt>A</tt>'s constructor as
13957 <del><tt>double&&</tt> (</del>an rvalue<del>)</del>.
13961 <pre>template <class T> typename remove_reference<T>::type&& move(T&& t);
13967 <del><i>Return type:</i> an rvalue.</del>
13979 <h3><a name="809"></a>809. std::swap should be overloaded for array types</h3>
13980 <p><b>Section:</b> 25.2.3 [alg.swap] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
13981 <b>Submitter:</b> Niels Dekker <b>Date:</b> 2008-02-28</p>
13982 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#alg.swap">issues</a> in [alg.swap].</p>
13983 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
13984 <p><b>Discussion:</b></p>
13986 For the sake of generic programming, the header <code><algorithm></code> should provide an
13987 overload of <code>std::swap</code> for array types:
13988 </p><pre>template<class T, size_t N> void swap(T (&a)[N], T (&b)[N]);
13993 It became apparent to me that this overload is missing, when I considered how to write a swap
13994 function for a generic wrapper class template.
13995 (Actually I was thinking of Boost's <a href="http://www.boost.org/libs/utility/value_init.htm">value_initialized</a>.)
13996 Please look at the following template, <code>W</code>, and suppose that is intended to be a very
13997 <em>generic</em> wrapper:
13998 </p><pre>template<class T> class W {
14003 Clearly <code>W<T></code> is <em>CopyConstructible and CopyAssignable</em>, and therefore
14004 <em>Swappable</em>, whenever <code>T</code> is <em>CopyConstructible and CopyAssignable</em>.
14005 Moreover, <code>W<T></code> is <em>also</em> Swappable when <code>T</code> is an array type
14006 whose element type is CopyConstructible and CopyAssignable.
14007 Still it is recommended to add a <em>custom</em> swap function template to such a class template,
14008 for the sake of efficiency and exception safety.
14009 (E.g., <em>Scott Meyers, Effective C++, Third Edition, item 25: Consider support for a non-throwing
14011 This function template is typically written as follows:
14012 <pre>template<class T> void swap(W<T>& x, W<T>& y) {
14014 swap(x.data, y.data);
14017 Unfortunately, this will introduce an undesirable inconsistency, when <code>T</code> is an array.
14018 For instance, <code>W<std::string[8]></code> is Swappable, but the current Standard does not
14019 allow calling the custom swap function that was especially written for <code>W</code>!
14020 <pre>W<std::string[8]> w1, w2; // Two objects of a Swappable type.
14021 std::swap(w1, w2); // Well-defined, but inefficient.
14023 swap(w1, w2); // Ill-formed, just because ADL finds W's swap function!!!
14026 <code>W</code>'s <code>swap</code> function would try to call <code>std::swap</code> for an array,
14027 <code>std::string[8]</code>, which is not supported by the Standard Library.
14028 This issue is easily solved by providing an overload of <code>std::swap</code> for array types.
14029 This swap function should be implemented in terms of swapping the elements of the arrays, so that
14030 it would be non-throwing for arrays whose element types have a non-throwing swap.
14034 Note that such an overload of <code>std::swap</code> should also support <em>multi-dimensional</em>
14035 arrays. Fortunately that isn't really an issue, because it would do so <i>automatically</i>, by
14036 means of recursion.
14040 For your information, there was a discussion on this issue at comp.lang.c++.moderated: <a href="http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/9341ebd3635c9c74">[Standard
14041 Library] Shouldn't std::swap be overloaded for C-style arrays?</a>
14045 <p><b>Proposed resolution:</b></p>
14047 Add an extra condition to the definition of Swappable requirements [swappable] in 20.1.1 [utility.arg.requirements]:
14050 - <tt>T</tt> is <tt>Swappable</tt> if <tt>T</tt> is an array type whose element type is <tt>Swappable</tt>.
14053 Add the following to 25.2.3 [alg.swap]:
14056 <pre>template<class T, size_t N> void swap(T (&a)[N], T (&b)[N]);
14059 <i>Requires:</i> Type <code>T</code> shall be <tt>Swappable</tt>.
14062 <i>Effects:</i> <code>swap_ranges(a, a + N, b);</code>
14071 <h3><a name="810"></a>810. Missing traits dependencies in operational semantics of extended manipulators</h3>
14072 <p><b>Section:</b> 27.6.4 [ext.manip] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14073 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-03-01</p>
14074 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#ext.manip">active issues</a> in [ext.manip].</p>
14075 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ext.manip">issues</a> in [ext.manip].</p>
14076 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14077 <p><b>Discussion:</b></p>
14079 The recent draft (as well as the original proposal n2072) uses an
14080 operational semantic
14081 for <tt>get_money</tt> ([ext.manip]/3) and <tt>put_money</tt> ([ext.manip]/5), which uses
14084 <blockquote><pre>istreambuf_iterator<charT>
14085 </pre></blockquote>
14091 <blockquote><pre>ostreambuf_iterator<charT>
14092 </pre></blockquote>
14095 resp, instead of the iterator instances, with explicitly provided
14096 traits argument (The operational semantic defined by <tt>f</tt> is also traits
14097 dependent). This is an obvious oversight because both <tt>*stream_buf</tt>
14098 c'tors expect a <tt>basic_streambuf<charT,traits></tt> as argument.
14101 The same problem occurs within the <tt>get_time</tt> and <tt>put_time</tt> semantic (p.
14103 of n2071 incorporated in N2521, where additional to the problem we
14104 have an editorial issue in <tt>get_time</tt> (<tt>streambuf_iterator</tt> instead of
14105 <tt>istreambuf_iterator</tt>).
14109 <p><b>Proposed resolution:</b></p>
14111 In 27.6.4 [ext.manip]/3 within function <tt>f</tt> replace the first line
14114 <blockquote><pre>template <class charT, class traits, class moneyT>
14115 void f(basic_ios<charT, traits>& str, moneyT& mon, bool intl) {
14116 typedef istreambuf_iterator<charT<ins>, traits</ins>> Iter;
14118 </pre></blockquote>
14121 In 27.6.4 [ext.manip]/4 remove the first template <tt>charT</tt> parameter:
14124 <blockquote><pre>template <<del>class charT, </del>class moneyT> unspecified put_money(const moneyT& mon, bool intl = false<ins>)</ins>;
14125 </pre></blockquote>
14128 In 27.6.4 [ext.manip]/5 within function <tt>f</tt> replace the first line
14131 <blockquote><pre>template <class charT, class traits, class moneyT>
14132 void f(basic_ios<charT, traits>& str, const moneyT& mon, bool intl) {
14133 typedef ostreambuf_iterator<charT<ins>, traits</ins>> Iter;
14135 </pre></blockquote>
14138 In 27.6.4 [ext.manip]/7 within function <tt>f</tt> replace the first line
14141 <blockquote><pre>template <class charT, class traits>
14142 void f(basic_ios<charT, traits>& str, struct tm *tmb, const charT *fmt) {
14143 typedef <ins>i</ins>streambuf_iterator<charT<ins>, traits</ins>> Iter;
14145 </pre></blockquote>
14148 In 27.6.4 [ext.manip]/8 add const:
14151 <blockquote><pre>template <class charT> unspecified put_time(<ins>const</ins> struct tm *tmb, const charT *fmt);
14152 </pre></blockquote>
14155 In 27.6.4 [ext.manip]/9 within function <tt>f</tt> replace the first line
14158 <blockquote><pre>template <class charT, class traits>
14159 void f(basic_ios<charT, traits>& str, const struct tm *tmb, const charT *fmt) {
14160 typedef ostreambuf_iterator<charT<ins>, traits</ins>> Iter;
14162 </pre></blockquote>
14165 Add to the <tt><iomanip></tt> synopsis in 27.6 [iostream.format]
14168 <blockquote><pre>template <class moneyT> unspecified get_money(moneyT& mon, bool intl = false);
14169 template <class moneyT> unspecified put_money(const moneyT& mon, bool intl = false);
14170 template <class charT> unspecified get_time(struct tm *tmb, const charT *fmt);
14171 template <class charT> unspecified put_time(const struct tm *tmb, const charT *fmt);
14172 </pre></blockquote>
14180 <h3><a name="811"></a>811. <tt>pair</tt> of pointers no longer works with literal 0</h3>
14181 <p><b>Section:</b> 20.2.3 [pairs] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14182 <b>Submitter:</b> Doug Gregor <b>Date:</b> 2008-03-14</p>
14183 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#pairs">issues</a> in [pairs].</p>
14184 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14185 <p><b>Discussion:</b></p>
14186 <blockquote><pre>#include <utility>
14190 std::pair<char *, char *> p (0,0);
14192 </pre></blockquote>
14195 I just got a bug report about that, because it's valid C++03, but not
14196 C++0x. The important realization, for me, is that the emplace
14197 proposal---which made <tt>push_back</tt> variadic, causing the <tt>push_back(0)</tt>
14198 issue---didn't cause this break in backward compatibility. The break
14199 actually happened when we added this pair constructor as part of adding
14200 rvalue references into the language, long before variadic templates or
14201 emplace came along:
14204 <blockquote><pre>template<class U, class V> pair(U&& x, V&& y);
14205 </pre></blockquote>
14208 Now, concepts will address this issue by constraining that <tt>pair</tt>
14209 constructor to only <tt>U</tt>'s and <tt>V</tt>'s that can properly construct "first" and
14210 "second", e.g. (from
14211 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2322.pdf">N2322</a>):
14214 <blockquote><pre>template<class U , class V >
14215 requires Constructible<T1, U&&> && Constructible<T2, V&&>
14216 pair(U&& x , V&& y );
14217 </pre></blockquote>
14221 <p><b>Proposed resolution:</b></p>
14230 <h3><a name="812"></a>812. unsolicited multithreading considered harmful?</h3>
14231 <p><b>Section:</b> 25.3.1 [alg.sort] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14232 <b>Submitter:</b> Paul McKenney <b>Date:</b> 2008-02-27</p>
14233 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14234 <p><b>Discussion:</b></p>
14236 Multi-threading is a good thing, but unsolicited multi-threading can
14237 potentially be harmful. For example, <tt>sort()</tt> performance might be
14238 greatly increased via a multithreaded implementation. However, such
14239 a multithreaded implementation could result in concurrent invocations
14240 of the user-supplied comparator. This would in turn result in problems
14241 given a caching comparator that might be written for complex sort keys.
14242 Please note that this is not a theoretical issue, as multithreaded
14243 implementations of <tt>sort()</tt> already exist.
14246 Having a multithreaded <tt>sort()</tt> available is good, but it should not
14247 be the default for programs that are not explicitly multithreaded.
14248 Users should not be forced to deal with concurrency unless they have
14253 This may be covered by
14254 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2410.html">N2410</a>
14255 Thread-Safety in the Standard Library (Rev 1).
14260 <p><b>Proposed resolution:</b></p>
14269 <h3><a name="813"></a>813. "empty" undefined for <tt>shared_ptr</tt></h3>
14270 <p><b>Section:</b> 20.7.12.2 [util.smartptr.shared] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
14271 <b>Submitter:</b> Matt Austern <b>Date:</b> 2008-02-26</p>
14272 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#util.smartptr.shared">active issues</a> in [util.smartptr.shared].</p>
14273 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#util.smartptr.shared">issues</a> in [util.smartptr.shared].</p>
14274 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
14275 <p><b>Discussion:</b></p>
14277 Several places in 20.7.12.2 [util.smartptr.shared] refer to an "empty" <tt>shared_ptr</tt>.
14278 However, that term is nowhere defined. The closest thing we have to a
14279 definition is that the default constructor creates an empty <tt>shared_ptr</tt>
14280 and that a copy of a default-constructed <tt>shared_ptr</tt> is empty. Are any
14281 other <tt>shared_ptr</tt>s empty? For example, is <tt>shared_ptr((T*) 0)</tt> empty? What
14282 are the properties of an empty <tt>shared_ptr</tt>? We should either clarify this
14283 term or stop using it.
14286 One reason it's not good enough to leave this term up to the reader's
14287 intuition is that, in light of
14288 <a href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2007/n2351.htm">N2351</a>
14289 and issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#711">711</a>, most readers'
14290 intuitive understanding is likely to be wrong. Intuitively one might
14291 expect that an empty <tt>shared_ptr</tt> is one that doesn't store a pointer,
14292 but, whatever the definition is, that isn't it.
14302 Or, what is an "empty" <tt>shared_ptr</tt>?
14308 Are any other <tt>shared_ptrs</tt> empty?
14311 Yes. Whether a given <tt>shared_ptr</tt> instance is empty or not is (*)
14312 completely specified by the last mutating operation on that instance.
14313 Give me an example and I'll tell you whether the <tt>shared_ptr</tt> is empty or
14317 (*) If it isn't, this is a legitimate defect.
14323 For example, is <tt>shared_ptr((T*) 0)</tt> empty?
14326 No. If it were empty, it would have a <tt>use_count()</tt> of 0, whereas it is
14327 specified to have an <tt>use_count()</tt> of 1.
14333 What are the properties of an empty <tt>shared_ptr</tt>?
14336 The properties of an empty <tt>shared_ptr</tt> can be derived from the
14337 specification. One example is that its destructor is a no-op. Another is
14338 that its <tt>use_count()</tt> returns 0. I can enumerate the full list if you
14345 We should either clarify this term or stop using it.
14348 I don't agree with the imperative tone
14351 A clarification would be either a no-op - if it doesn't contradict the
14352 existing wording - or a big mistake if it does.
14355 I agree that a clarification that is formally a no-op may add value.
14361 However, that term is nowhere defined.
14364 Terms can be useful without a definition. Consider the following
14365 simplistic example. We have a type <tt>X</tt> with the following operations
14368 <blockquote><pre>X x;
14372 </pre></blockquote>
14374 A default-constructed value is green.<br>
14375 A copy has the same color as the original.<br>
14376 <tt>f(x)</tt> returns a red value if the argument is green, a green value otherwise.<br>
14377 <tt>g(x1,x2)</tt> returns a green value if the arguments are of the same color, a red value otherwise.
14381 Given these definitions, you can determine the color of every instance
14382 of type <tt>X</tt>, even if you have absolutely no idea what green and red mean.
14386 Green and red are "nowhere defined" and completely defined at the same time.
14392 Alisdair's wording is fine.
14397 <p><b>Proposed resolution:</b></p>
14399 Append the following sentance to 20.7.12.2 [util.smartptr.shared]
14402 The <code>shared_ptr</code> class template stores a pointer, usually obtained
14403 via <code>new</code>. <code>shared_ptr</code> implements semantics of
14404 shared ownership; the last remaining owner of the pointer is responsible for
14405 destroying the object, or otherwise releasing the resources associated with
14406 the stored pointer. <ins>A <code>shared_ptr</code> object that does not own
14407 a pointer is said to be <i>empty</i>.</ins>
14415 <h3><a name="814"></a>814. <tt>vector<bool>::swap(reference, reference)</tt> not defined</h3>
14416 <p><b>Section:</b> 23.2.7 [vector.bool] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14417 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-03-17</p>
14418 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#vector.bool">active issues</a> in [vector.bool].</p>
14419 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#vector.bool">issues</a> in [vector.bool].</p>
14420 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14421 <p><b>Discussion:</b></p>
14423 <tt>vector<bool>::swap(reference, reference)</tt> has no definition.
14427 <p><b>Proposed resolution:</b></p>
14436 <h3><a name="815"></a>815. <tt>std::function</tt> and <tt>reference_closure</tt> do not use perfect forwarding</h3>
14437 <p><b>Section:</b> 20.6.15.2.4 [func.wrap.func.inv] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
14438 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-03-16</p>
14439 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
14440 <p><b>Discussion:</b></p>
14442 <tt>std::function</tt> and <tt>reference_closure</tt> should use "perfect forwarding" as
14443 described in the rvalue core proposal.
14452 According to Doug Gregor, as far as <tt>std::function</tt> is concerned, perfect
14453 forwarding can not be obtained because of type erasure. Not everyone
14454 agreed with this diagnosis of forwarding.
14459 <p><b>Proposed resolution:</b></p>
14468 <h3><a name="816"></a>816. Should <tt>bind()</tt>'s returned functor have a nofail copy ctor when <tt>bind()</tt> is nofail?</h3>
14469 <p><b>Section:</b> 20.6.11.1.3 [func.bind.bind] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14470 <b>Submitter:</b> Stephan T. Lavavej <b>Date:</b> 2008-02-08</p>
14471 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#func.bind.bind">active issues</a> in [func.bind.bind].</p>
14472 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#func.bind.bind">issues</a> in [func.bind.bind].</p>
14473 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14474 <p><b>Discussion:</b></p>
14476 Library Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#527">527</a> notes that <tt>bind(f, t1, ..., tN)</tt>
14477 should be nofail when <tt>f, t1, ..., tN</tt> have nofail copy ctors.
14480 However, no guarantees are provided for the copy ctor of the functor
14481 returned by <tt>bind()</tt>. (It's guaranteed to have a copy ctor, which can
14482 throw implementation-defined exceptions: <tt>bind()</tt> returns a forwarding
14483 call wrapper, TR1 3.6.3/2. A forwarding call wrapper is a call wrapper,
14484 TR1 3.3/4. Every call wrapper shall be CopyConstructible, TR1 3.3/4.
14485 Everything without an exception-specification may throw
14486 implementation-defined exceptions unless otherwise specified, C++03
14490 Should the nofail guarantee requested by Library Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#527">527</a> be extended
14491 to cover both calling <tt>bind()</tt> and copying the returned functor?
14500 <tt>tuple</tt> construction should probably have a similar guarantee.
14505 <p><b>Proposed resolution:</b></p>
14514 <h3><a name="817"></a>817. <tt>bind</tt> needs to be moved</h3>
14515 <p><b>Section:</b> 20.6.11.1.3 [func.bind.bind] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14516 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2008-03-17</p>
14517 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#func.bind.bind">active issues</a> in [func.bind.bind].</p>
14518 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#func.bind.bind">issues</a> in [func.bind.bind].</p>
14519 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14520 <p><b>Discussion:</b></p>
14522 The functor retureed by <tt>bind()</tt> should have a move constructor that
14523 requires only move construction of its contained functor and bound arguments.
14524 That way move-only functors can be passed to objects such as <tt>thread</tt>.
14527 This issue is related to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#816">816</a>.
14531 <p><b>Proposed resolution:</b></p>
14540 <h3><a name="818"></a>818. wording for memory ordering</h3>
14541 <p><b>Section:</b> 29.1 [atomics.order] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14542 <b>Submitter:</b> Jens Maurer <b>Date:</b> 2008-03-22</p>
14543 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14544 <p><b>Discussion:</b></p>
14546 29.1 [atomics.order] p1 says in the table that
14552 <th>Element</th><th>Meaning</th>
14555 <td><tt>memory_order_acq_rel</tt></td>
14556 <td>the operation has both acquire and release semantics</td>
14562 To my naked eye, that seems to imply that even an atomic read has both
14563 acquire and release semantics.
14567 Then, p1 says in the table:
14573 <th>Element</th><th>Meaning</th>
14576 <td><tt>memory_order_seq_cst</tt></td>
14577 <td>the operation has both acquire and release semantics,
14578 and, in addition, has sequentially-consistent operation ordering</td>
14584 So that seems to be "the same thing" as <tt>memory_order_acq_rel</tt>, with additional
14589 I'm then reading p2, where it says:
14593 The <tt>memory_order_seq_cst</tt> operations that load a value are acquire operations
14594 on the affected locations. The <tt>memory_order_seq_cst</tt> operations that store a value
14595 are release operations on the affected locations.
14599 That seems to imply that atomic reads only have acquire semantics. If that
14600 is intended, does this also apply to <tt>memory_order_acq_rel</tt> and the individual
14601 load/store operations as well?
14605 Also, the table in p1 contains phrases with "thus" that seem to indicate
14606 consequences of normative wording in 1.10 [intro.multithread]. That shouldn't be in
14607 normative text, for the fear of redundant or inconsistent specification with
14608 the other normative text.
14612 Double-check 29.4 [atomics.types.operations] that each
14613 operation clearly says whether it's a load or a store operation, or
14614 both. (It could be clearer, IMO. Solution not in current proposed resolution.)
14618 29.1 [atomics.order] p2: What's a "consistent execution"? It's not defined in
14619 1.10 [intro.multithread], it's just used in notes there.
14623 And why does 29.4 [atomics.types.operations] p9 for "load" say:
14628 <i>Requires:</i> The order argument shall not be <tt>memory_order_acquire</tt>
14629 nor <tt>memory_order_acq_rel</tt>.
14633 (Since this is exactly the same restriction as for "store", it seems to be a typo.)
14637 And then: 29.4 [atomics.types.operations] p12:
14641 These operations are read-modify-write operations in the sense of the
14642 "synchronizes with" definition (1.10 [intro.multithread]), so both such an operation and the
14643 evaluation that produced the input value synchronize with any evaluation
14644 that reads the updated value.
14648 This is redundant with 1.10 [intro.multithread], see above for the reasoning.
14652 <p><b>Proposed resolution:</b></p>
14654 Replace the cross-reference in p1 to refer to 1.1 [intro.scope] instead of
14655 1.7 [intro.memory].
14656 Rephrase the table in as follows (maybe don't use a table):
14661 For <tt>memory_order_relaxed</tt>, no operation orders memory.
14665 For <tt>memory_order_release</tt>, <tt>memory_order_acq_rel</tt>, and <tt>memory_order_seq_cst</tt>,
14666 a store operation performs a release operation on the affected memory location.
14670 For <tt>memory_order_acquire</tt>, <tt>memory_order_acq_rel</tt>, and <tt>memory_order_seq_cst</tt>,
14671 a load operation performs an acquire operation on the affected memory location.
14676 Rephrase 29.1 [atomics.order] p2:
14680 <del>The <tt>memory_order_seq_cst</tt> operations that load a value are
14681 acquire operations on the affected locations. The
14682 <tt>memory_order_seq_cst</tt> operations that store a value are release
14683 operations on the affected locations.</del>
14684 <del>In addition, in a consistent
14685 execution, t</del><ins>T</ins>here <del>must be</del> <ins>is</ins> a single
14686 total order <tt>S</tt> on all
14687 <tt>memory_order_seq_cst</tt> operations, consistent with the happens before
14688 order and modification orders for all affected locations, such that each
14689 <tt>memory_order_seq_cst</tt> operation observes either the last preceding
14690 modification according to this order <tt>S</tt>, or the result of an operation
14691 that is not <tt>memory_order_seq_cst</tt>. [<i>Note:</i> Although it is not explicitly
14692 required that <tt>S</tt> include locks, it can always be extended to an order
14693 that does include lock and unlock operations, since the ordering between
14694 those is already included in the happens before ordering. <i>-- end note</i>]
14698 Rephrase 29.4 [atomics.types.operations] p12 as:
14702 <i>Effects:</i> Atomically replaces the value pointed to by object or by
14703 this with desired. Memory is affected according to the value of order.
14704 These operations are read-modify-write operations <del>in the sense of the
14705 "synchronizes with" definition</del> (1.10 [intro.multithread])<del>, so both such an operation and the
14706 evaluation that produced the input value synchronize with any evaluation
14707 that reads the updated value</del>.
14711 Same in p15, p20, p22.
14720 <h3><a name="819"></a>819. rethrow_if_nested</h3>
14721 <p><b>Section:</b> 18.7.6 [except.nested] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14722 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-03-25</p>
14723 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14724 <p><b>Discussion:</b></p>
14726 Looking at the wording I submitted for <tt>rethrow_if_nested</tt>, I don't think I
14727 got it quite right.
14731 The current wording says:
14735 <pre>template <class E> void rethrow_if_nested(const E& e);
14739 <i>Effects:</i> Calls <tt>e.rethrow_nested()</tt> only if <tt>e</tt>
14740 is publicly derived from <tt>nested_exception</tt>.
14746 This is trying to be a bit subtle, by requiring <tt>e</tt> (not <tt>E</tt>) to be publicly
14747 derived from <tt>nested_exception</tt> the idea is that a <tt>dynamic_cast</tt> would be
14748 required to be sure. Unfortunately, if <tt>e</tt> is dynamically but not statically
14749 derived from <tt>nested_exception</tt>, <tt>e.rethrow_nested()</tt> is ill-formed.
14753 <p><b>Proposed resolution:</b></p>
14760 <h3><a name="820"></a>820. <tt>current_exception()</tt>'s interaction with throwing copy ctors</h3>
14761 <p><b>Section:</b> 18.7.5 [propagation] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14762 <b>Submitter:</b> Stephan T. Lavavej <b>Date:</b> 2008-03-26</p>
14763 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#propagation">active issues</a> in [propagation].</p>
14764 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#propagation">issues</a> in [propagation].</p>
14765 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14766 <p><b>Discussion:</b></p>
14768 As of N2521, the Working Paper appears to be silent about what
14769 <tt>current_exception()</tt> should do if it tries to copy the currently handled
14770 exception and its copy constructor throws. 18.7.5 [propagation]/7 says "If the
14771 function needs to allocate memory and the attempt fails, it returns an
14772 <tt>exception_ptr</tt> object that refers to an instance of <tt>bad_alloc</tt>.", but
14773 doesn't say anything about what should happen if memory allocation
14774 succeeds but the actual copying fails.
14778 I see three alternatives: (1) return an <tt>exception_ptr</tt> object that refers
14779 to an instance of some fixed exception type, (2) return an <tt>exception_ptr</tt>
14780 object that refers to an instance of the copy ctor's thrown exception
14781 (but if that has a throwing copy ctor, an infinite loop can occur), or
14782 (3) call <tt>terminate()</tt>.
14786 I believe that <tt>terminate()</tt> is the most reasonable course of action, but
14787 before we go implement that, I wanted to raise this issue.
14797 The current practice is to not have throwing copy constructors in
14798 exception classes, because this can lead to <tt>terminate()</tt> as described in
14799 15.5.1 [except.terminate]. Thus calling <tt>terminate()</tt> in this situation seems
14800 consistent and does not introduce any new problems.
14804 However, the resolution of core issue 475 may relax this requirement:
14808 The CWG agreed with the position that <tt>std::uncaught_exception()</tt> should
14809 return <tt>false</tt> during the copy to the exception object and that <tt>std::terminate()</tt>
14810 should not be called if that constructor exits with an exception.
14814 Since throwing copy constructors will no longer call <tt>terminate()</tt>, option
14815 (3) doesn't seem reasonable as it is deemed too drastic a response in a
14816 recoverable situation.
14820 Option (2) cannot be adopted by itself, because a potential infinite
14821 recursion will need to be terminated by one of the other options.
14827 <p><b>Proposed resolution:</b></p>
14829 Add the following paragraph after 18.7.5 [propagation]/7:
14834 <i>Returns (continued):</i> If the attempt to copy the current exception
14835 object throws an exception, the function returns an <tt>exception_ptr</tt> that
14836 refers to the thrown exception or, if this is not possible, to an
14837 instance of <tt>bad_exception</tt>.
14840 [<i>Note:</i> The copy constructor of the thrown exception may also fail, so
14841 the implementation is allowed to substitute a <tt>bad_exception</tt> to avoid
14842 infinite recursion. <i>-- end note.</i>]
14852 <h3><a name="821"></a>821. Minor cleanup : <tt>unique_ptr</tt></h3>
14853 <p><b>Section:</b> 20.7.11.3.3 [unique.ptr.runtime.modifiers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14854 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-03-30</p>
14855 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14856 <p><b>Discussion:</b></p>
14858 Reading resolution of LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a> I noticed the following:
14862 <pre>void reset(<del>T*</del> <ins>pointer</ins> p = <del>0</del> <ins>pointer()</ins>);
14866 -1- <i>Requires:</i> Does not accept pointer types which are convertible
14867 to <del><tt>T*</tt></del> <ins><tt>pointer</tt></ins> (diagnostic
14868 required). [<i>Note:</i> One implementation technique is to create a private
14869 templated overload. <i>-- end note</i>]
14874 This could be cleaned up by mandating the overload as a public deleted
14875 function. In addition, we should probably overload <tt>reset</tt> on <tt>nullptr_t</tt>
14876 to be a stronger match than the deleted overload. Words...
14880 <p><b>Proposed resolution:</b></p>
14882 Add to class template definition in 20.7.11.3 [unique.ptr.runtime]
14888 void reset(T* p = 0);
14889 <ins>void reset( nullptr_t );</ins>
14890 <ins>template< typename T > void reset( T ) = delete;</ins>
14891 void swap(unique_ptr&& u);
14896 Update 20.7.11.3.3 [unique.ptr.runtime.modifiers]
14900 <pre>void reset(pointer p = pointer());
14901 <ins>void reset(nullptr_t);</ins>
14905 <del>-1- <i>Requires:</i> Does not accept pointer types which are convertible
14906 to <tt>pointer</tt> (diagnostic
14907 required). [<i>Note:</i> One implementation technique is to create a private
14908 templated overload. <i>-- end note</i>]</del>
14911 <i>Effects:</i> If <tt>get() == nullptr</tt> there are no effects. Otherwise <tt>get_deleter()(get())</tt>.
14917 Note this wording incorporates resolutions for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#806">806</a> (New) and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a> (Ready).
14926 <h3><a name="822"></a>822. Object with explicit copy constructor no longer <tt>CopyConstructible</tt></h3>
14927 <p><b>Section:</b> 20.1.1 [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
14928 <b>Submitter:</b> James Kanze <b>Date:</b> 2008-04-01</p>
14929 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#utility.arg.requirements">active issues</a> in [utility.arg.requirements].</p>
14930 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#utility.arg.requirements">issues</a> in [utility.arg.requirements].</p>
14931 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
14932 <p><b>Discussion:</b></p>
14934 I just noticed that the following program is legal in C++03, but
14935 is forbidden in the current draft:
14938 <blockquote><pre>#include <vector>
14939 #include <iostream>
14945 explicit Toto( Toto const& ) {}
14951 std::vector< Toto > v( 10 ) ;
14954 </pre></blockquote>
14957 Is this change intentional? (And if so, what is the
14958 justification? I wouldn't call such code good, but I don't see
14959 any reason to break it unless we get something else in return.)
14964 <p><b>Proposed resolution:</b></p>
14966 In 20.1.1 [utility.arg.requirements] change Table 33: <tt>MoveConstructible</tt> requirements [moveconstructible]:
14972 <th>expression</th><th>post-condition</th>
14975 <td><tt>T t<ins>(rv)</ins><del> = rv</del></tt></td><td><tt>t</tt> is equivalent to the value of <tt>rv</tt> before the construction</td>
14978 <td colspan="2" align="center">...</td>
14984 In 20.1.1 [utility.arg.requirements] change Table 34: <tt>CopyConstructible</tt> requirements [copyconstructible]:
14990 <th>expression</th><th>post-condition</th>
14993 <td><tt>T t<ins>(u)</ins><del> = u</del></tt></td><td>the value of <tt>u</tt> is unchanged and is equivalent to <tt>t</tt></td>
14996 <td colspan="2" align="center">...</td>
15006 <h3><a name="823"></a>823. <tt>identity<void></tt> seems broken</h3>
15007 <p><b>Section:</b> 20.2.2 [forward] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
15008 <b>Submitter:</b> Walter Brown <b>Date:</b> 2008-04-09</p>
15009 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#forward">active issues</a> in [forward].</p>
15010 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#forward">issues</a> in [forward].</p>
15011 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
15012 <p><b>Discussion:</b></p>
15014 N2588 seems to have added an <tt>operator()</tt> member function to the
15015 <tt>identity<></tt> helper in 20.2.2 [forward]. I believe this change makes it no
15016 longer possible to instantiate <tt>identity<void></tt>, as it would require
15017 forming a reference-to-<tt>void</tt> type as this <tt>operator()</tt>'s parameter type.
15021 Suggested resolution: Specialize <tt>identity<void></tt> so as not to require
15022 the member function's presence.
15032 Jens: suggests to add a requires clause to avoid specializing on <tt>void</tt>.
15035 Alisdair: also consider cv-qualified <tt>void</tt>.
15038 Alberto provided proposed wording.
15043 <p><b>Proposed resolution:</b></p>
15045 Change definition of <tt>identity</tt> in 20.2.2 [forward], paragraph 2, to:
15048 <blockquote><pre>template <class T> struct identity {
15051 <ins>requires ReferentType<T></ins>
15052 const T& operator()(const T& x) const;
15054 </pre></blockquote>
15056 <blockquote><pre> <ins>requires ReferentType<T></ins>
15057 const T& operator()(const T& x) const;
15058 </pre></blockquote>
15061 <p><b>Rationale:</b></p>
15063 The point here is to able to write <tt>T&</tt> given <tt>T</tt> and <tt>ReferentType</tt> is
15064 precisely the concept that guarantees so, according to N2677
15065 (Foundational concepts). Because of this, it seems preferable than an
15066 explicit check for <tt>cv void</tt> using <tt>SameType/remove_cv</tt> as it was suggested
15067 in Sophia. In particular, Daniel remarked that there may be types other
15068 than <tt>cv void</tt> which aren't referent types (<tt>int[]</tt>, perhaps?).
15076 <h3><a name="824"></a>824. rvalue ref issue with <tt>basic_string</tt> inserter</h3>
15077 <p><b>Section:</b> 21.3.8.9 [string.io] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
15078 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-04-10</p>
15079 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#string.io">issues</a> in [string.io].</p>
15080 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
15081 <p><b>Discussion:</b></p>
15083 In the current working paper, the <tt><string></tt> header synopsis at the end of
15084 21.2 [string.classes] lists a single <tt>operator<<</tt> overload
15085 for <tt>basic_string</tt>.
15088 <blockquote><pre>template<class charT, class traits, class Allocator>
15089 basic_ostream<charT, traits>&
15090 operator<<(basic_ostream<charT, traits>&& os,
15091 const basic_string<charT,traits,Allocator>& str);
15092 </pre></blockquote>
15095 The definition in 21.3.8.9 [string.io] lists two:
15098 <blockquote><pre>template<class charT, class traits, class Allocator>
15099 basic_ostream<charT, traits>&
15100 operator<<(basic_ostream<charT, traits>& os,
15101 const basic_string<charT,traits,Allocator>& str);
15103 template<class charT, class traits, class Allocator>
15104 basic_ostream<charT, traits>&
15105 operator<<(basic_ostream<charT, traits>&& os,
15106 const basic_string<charT,traits,Allocator>& str);
15107 </pre></blockquote>
15110 I believe the synopsis in 21.2 [string.classes] is correct, and the first of the two
15111 signatures in 21.3.8.9 [string.io] should be deleted.
15115 <p><b>Proposed resolution:</b></p>
15117 Delete the first of the two signatures in 21.3.8.9 [string.io]:
15120 <blockquote><pre><del>template<class charT, class traits, class Allocator>
15121 basic_ostream<charT, traits>&
15122 operator<<(basic_ostream<charT, traits>& os,
15123 const basic_string<charT,traits,Allocator>& str);</del>
15125 template<class charT, class traits, class Allocator>
15126 basic_ostream<charT, traits>&
15127 operator<<(basic_ostream<charT, traits>&& os,
15128 const basic_string<charT,traits,Allocator>& str);
15129 </pre></blockquote>
15136 <h3><a name="825"></a>825. Missing rvalues reference stream insert/extract operators?</h3>
15137 <p><b>Section:</b> 19.4.2.1 [syserr.errcode.overview], 20.7.12.2.8
15138 [util.smartptr.shared.io], 22.2.8 [facets.examples], 23.3.5.3
15139 [bitset.operators], 26.3.6 [complex.ops], 27.5 [stream.buffers], 28.9
15140 [re.submatch] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15141 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-04-10</p>
15142 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
15143 <p><b>Discussion:</b></p>
15145 Should the following use rvalues references to stream in insert/extract
15150 <li>19.4.2.1 [syserr.errcode.overview]</li>
15151 <li>20.7.12.2.8 [util.smartptr.shared.io]</li>
15152 <li>22.2.8 [facets.examples]</li>
15153 <li>23.3.5.3 [bitset.operators]</li>
15154 <li>26.3.6 [complex.ops]</li>
15155 <li>Doubled signatures in 27.5 [stream.buffers] for character inserters
15156 (ref 27.6.2.6.4 [ostream.inserters.character])
15157 + definition 27.6.2.6.4 [ostream.inserters.character]</li>
15158 <li>28.9 [re.submatch]</li>
15167 Agree with the idea in the issue, Alisdair to provide wording.
15172 <p><b>Proposed resolution:</b></p>
15181 <h3><a name="827"></a>827. <tt>constexpr shared_ptr::shared_ptr()?</tt></h3>
15182 <p><b>Section:</b> 20.7.12.2.1 [util.smartptr.shared.const] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
15183 <b>Submitter:</b> Peter Dimov <b>Date:</b> 2008-04-11</p>
15184 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#util.smartptr.shared.const">issues</a> in [util.smartptr.shared.const].</p>
15185 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
15186 <p><b>Discussion:</b></p>
15188 Would anyone object to making the default constructor of <tt>shared_ptr</tt> (and
15189 <tt>weak_ptr</tt> and <tt>enable_shared_from_this) constexpr</tt>? This would enable
15190 static initialization for <tt>shared_ptr</tt> variables, eliminating another
15191 unfair advantage of raw pointers.
15195 <p><b>Proposed resolution:</b></p>
15204 <h3><a name="828"></a>828. Static initialization for <tt>std::mutex</tt>?</h3>
15205 <p><b>Section:</b> 30.3.1.1 [thread.mutex.class] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
15206 <b>Submitter:</b> Peter Dimov <b>Date:</b> 2008-04-18</p>
15207 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
15208 <p><b>Discussion:</b></p>
15210 [Note: I'm assuming here that 3.6.2 [basic.start.init]/1 will be fixed.]
15213 Currently <tt>std::mutex</tt> doesn't support static initialization. This is a
15214 regression with respect to <tt>pthread_mutex_t</tt>, which does. I believe that
15215 we should strive to eliminate such regressions in expressive power where
15216 possible, both to ease migration and to not provide incentives to (or
15217 force) people to forego the C++ primitives in favor of pthreads.
15227 We believe this is implementable on POSIX, because the initializer-list
15228 feature and the constexpr feature make this work. Double-check core
15229 language about static initialization for this case. Ask core for a core
15230 issue about order of destruction of statically-initialized objects wrt.
15231 dynamically-initialized objects (should come afterwards). Check
15232 non-POSIX systems for implementability.
15235 If ubiquitous implementability cannot be assured, plan B is to introduce
15236 another constructor, make this constexpr, which is
15237 conditionally-supported. To avod ambiguities, this new constructor needs
15238 to have an additional parameter.
15243 <p><b>Proposed resolution:</b></p>
15245 Change 30.3.1.1 [thread.mutex.class]:
15248 <blockquote><pre>class mutex {
15250 <ins>constexpr</ins> mutex();
15252 </pre></blockquote>
15259 <h3><a name="829"></a>829. current_exception wording unclear about exception type</h3>
15260 <p><b>Section:</b> 18.7.5 [propagation] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
15261 <b>Submitter:</b> Beman Dawes <b>Date:</b> 2008-04-20</p>
15262 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#propagation">active issues</a> in [propagation].</p>
15263 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#propagation">issues</a> in [propagation].</p>
15264 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
15265 <p><b>Discussion:</b></p>
15266 <p>Consider this code:</p>
15269 <pre>exception_ptr xp;</pre>
15270 <pre>try {do_something(); }
15272 catch (const runtime_error& ) {xp = current_exception();}
15276 rethrow_exception(xp);</pre>
15280 Say <code>do_something()</code> throws an exception object of type <code>
15281 range_error</code>. What is the type of the exception object thrown by <code>
15282 rethrow_exception(xp)</code> above? It must have a type of <code>range_error</code>;
15283 if it were of type <code>runtime_error</code> it still isn't possible to
15284 propagate an exception and the exception_ptr/current_exception/rethrow_exception
15285 machinery serves no useful purpose.
15289 Unfortunately, the current wording does not explicitly say that. Different
15290 people read the current wording and come to different conclusions. While it may
15291 be possible to deduce the correct type from the current wording, it would be
15292 much clearer to come right out and explicitly say what the type of the referred
15303 I don't like the proposed resolution of 829. The normative text is
15304 unambiguous that the <tt>exception_ptr</tt> refers to the <em>currently handled
15305 exception</em>. This term has a standard meaning, see 15.3 [except.handle]/8; this is the
15306 exception that <tt>throw;</tt> would rethrow, see 15.1 [except.throw]/7.
15309 A better way to address this is to simply add the non-normative example
15310 in question as a clarification. The term <i>currently handled exception</i>
15311 should be italicized and cross-referenced. A [<i>Note:</i> the currently
15312 handled exception is the exception that a throw expression without an
15313 operand (15.1 [except.throw]/7) would rethrow. <i>--end note</i>] is also an option.
15319 <p><b>Proposed resolution:</b></p>
15322 After 18.7.5 [propagation] , paragraph 7, add the indicated text:
15326 <pre>exception_ptr current_exception();</pre>
15330 <i>Returns:</i> <code>exception_ptr</code> object that refers
15331 to the currently handled exception <ins>(15.3 [except.handle])</ins> or a copy of the currently handled
15332 exception, or a null <code>exception_ptr</code> object if no exception is being handled. If
15333 the function needs to allocate memory and the attempt fails, it returns an
15334 <code>exception_ptr</code> object that refers to an instance of <code>bad_alloc</code>.
15335 It is unspecified whether the return values of two successive calls to
15336 <code>current_exception</code> refer to the same exception object.
15337 [<i>Note:</i> that is, it
15338 is unspecified whether <code>current_exception</code>
15339 creates a new copy each time it is called.
15340 <i>-- end note</i>]
15344 <i>Throws:</i> nothing.
15356 <h3><a name="830"></a>830. Incomplete list of char_traits specializations</h3>
15357 <p><b>Section:</b> 21.1 [char.traits] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15358 <b>Submitter:</b> Dietmar Kühl <b>Date:</b> 2008-04-23</p>
15359 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#char.traits">issues</a> in [char.traits].</p>
15360 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
15361 <p><b>Discussion:</b></p>
15363 Paragraph 4 of 21.1 [char.traits] mentions that this
15364 section specifies two specializations (<code>char_traits<char></code>
15365 and (<code>char_traits<wchar_t></code>). However, there are actually
15366 four specializations provided, i.e. in addition to the two above also
15367 <code>char_traits<char16_t></code> and <code>char_traits<char32_t></code>).
15368 I guess this was just an oversight and there is nothing wrong with just
15377 <tt>char_traits< char16/32_t ></tt>
15378 should also be added to <tt><ios_fwd></tt> in 27.2 [iostream.forward], and all the specializations
15379 taking a <tt>char_traits</tt> parameter in that header.
15389 Idea of the issue is ok.
15392 Alisdair to provide wording, once that wording arrives, move to review.
15398 <p><b>Proposed resolution:</b></p>
15400 Replace paragraph 4 of 21.1 [char.traits] by:
15404 This subclause specifies a struct template, <code>char_traits<charT></code>,
15405 and four explicit specializations of it, <code>char_traits<char></code>,
15406 <code>char_traits<char16_t></code>, <code>char_traits<char32_t></code>, and
15407 <code>char_traits<wchar_t></code>, all of which appear in the header
15408 <string> and satisfy the requirements below.
15417 <h3><a name="832"></a>832. Applying constexpr to System error support</h3>
15418 <p><b>Section:</b> 19.4 [syserr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15419 <b>Submitter:</b> Beman Dawes <b>Date:</b> 2008-05-14</p>
15420 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#syserr">active issues</a> in [syserr].</p>
15421 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#syserr">issues</a> in [syserr].</p>
15422 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
15423 <p><b>Discussion:</b></p>
15425 Initialization of objects of class <tt>error_code</tt>
15426 (19.4.2 [syserr.errcode]) and class
15427 <tt>error_condition</tt> (19.4.3 [syserr.errcondition]) can be made simpler and more reliable by use of
15428 the new <tt>constexpr</tt> feature
15429 [<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2349.pdf">N2349</a>]
15430 of C++0x. Less code will need to be
15431 generated for both library implementations and user programs when
15432 manipulating constant objects of these types.
15436 This was not proposed originally because the constant expressions
15437 proposal was moving into the standard at about the same time as the
15438 Diagnostics Enhancements proposal
15439 [<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2241.html">N2241</a>],
15440 and it wasn't desirable to
15441 make the later depend on the former. There were also technical concerns
15442 as to how <tt>constexpr</tt> would apply to references. Those concerns are now
15443 resolved; <tt>constexpr</tt> can't be used for references, and that fact is
15444 reflected in the proposed resolution.
15448 Thanks to Jens Maurer, Gabriel Dos Reis, and Bjarne Stroustrup for clarification of <tt>constexpr</tt> requirements.
15452 LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#804">804</a> is related in that it raises the question of whether the
15453 exposition only member <tt>cat_</tt> of class <tt>error_code</tt> (19.4.2 [syserr.errcode]) and class
15454 <tt>error_condition</tt> (19.4.3 [syserr.errcondition]) should be presented as a reference or pointer.
15455 While in the context of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#804">804</a> that is arguably an editorial question,
15456 presenting it as a pointer becomes more or less required with this
15457 proposal, given <tt>constexpr</tt> does not play well with references. The
15458 proposed resolution thus changes the private member to a pointer, which
15459 also brings it in sync with real implementations.
15468 On going question of extern pointer vs. inline functions for interface.
15478 Beman Dawes reports that this proposal is unimplementable, and thus NAD.
15481 Implementation would require <tt>constexpr</tt> objects of classes derived
15482 from class <tt>error_category</tt>, which has virtual functions, and that is
15483 not allowed by the core language. This was determined when trying to
15484 implement the proposal using a constexpr enabled compiler provided
15485 by Gabriel Dos Reis, and subsequently verified in discussions with
15486 Gabriel and Jens Maurer.
15492 <p><b>Proposed resolution:</b></p>
15494 The proposed wording assumes the LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#805">805</a> proposed wording has been
15495 applied to the WP, resulting in the former <tt>posix_category</tt> being renamed
15496 <tt>generic_category</tt>. If <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#805">805</a> has not been applied, the names in this
15497 proposal must be adjusted accordingly.
15501 Change 19.4.1.1 [syserr.errcat.overview] Class
15502 <tt>error_category</tt> overview <tt>error_category</tt> synopsis as
15506 <blockquote><pre><del>const error_category& get_generic_category();</del>
15507 <del>const error_category& get_system_category();</del>
15509 <del>static</del> <ins>extern</ins> const error_category<del>&</del><ins>* const</ins> generic_category<del> = get_generic_category()</del>;
15510 <del>static</del> <ins>extern</ins> const error_category<del>&</del><ins>* const</ins> <del>native_category</del> system_category<del> = get_system_category()</del>;
15511 </pre></blockquote>
15514 Change 19.4.1.5 [syserr.errcat.objects] Error category objects as indicated:
15518 <pre><ins>extern</ins> const error_category<del>&</del><ins>* const</ins> <del>get_</del>generic_category<del>()</del>;
15521 <del><i>Returns:</i> A reference</del> <ins><tt>generic_category</tt> shall point</ins>
15522 to <del>an</del> <ins>a statically initialized</ins> object of a type derived from
15523 class <tt>error_category</tt>.
15527 <del><i>Remarks:</i></del> The object's <tt>default_error_condition</tt> and <tt>equivalent</tt> virtual
15528 functions shall behave as specified for the class <tt>error_category</tt>. The
15529 object's <tt>name</tt> virtual function shall return a pointer to the string
15530 <tt>"GENERIC"</tt>.
15533 <pre><ins>extern</ins> const error_category<del>&</del><ins>* const</ins> <del>get_</del>system_category<del>()</del>;
15537 <del><i>Returns:</i> A reference</del> <ins><tt>system_category</tt> shall point</ins>
15538 to <del>an</del> <ins>a statically
15539 initialized</ins> object of a type derived from class <tt>error_category</tt>.
15543 <del><i>Remarks:</i></del> The object's <tt>equivalent</tt> virtual functions shall behave as
15544 specified for class <tt>error_category</tt>. The object's <tt>name</tt> virtual function
15545 shall return a pointer to the string <tt>"system"</tt>. The object's
15546 <tt>default_error_condition</tt> virtual function shall behave as follows:
15550 If the argument <tt>ev</tt> corresponds to a POSIX <tt>errno</tt> value <tt>posv</tt>, the function
15551 shall return <tt>error_condition(posv, generic_category)</tt>. Otherwise, the
15552 function shall return <tt>error_condition(ev, system_category)</tt>. What
15553 constitutes correspondence for any given operating system is
15554 unspecified. [<i>Note:</i> The number of potential system error codes is large
15555 and unbounded, and some may not correspond to any POSIX <tt>errno</tt> value.
15556 Thus implementations are given latitude in determining correspondence.
15557 <i>-- end note</i>]
15562 Change 19.4.2.1 [syserr.errcode.overview] Class <tt>error_code</tt> overview as indicated:
15565 <blockquote><pre>class error_code {
15568 <ins>constexpr</ins> error_code(int val, const error_category<del>&</del><ins>*</ins> cat);
15570 void assign(int val, const error_category<del>&</del><ins>*</ins> cat);
15572 const error_category<del>&</del><ins>*</ins> category() const;
15575 int val_; // exposition only
15576 const error_category<del>&</del><ins>*</ins> cat_; // exposition only
15577 </pre></blockquote>
15580 Change 19.4.2.2 [syserr.errcode.constructors] Class <tt>error_code</tt> constructors as indicated:
15584 <pre><ins>constexpr</ins> error_code(int val, const error_category<del>&</del><ins>*</ins> cat);
15587 <i>Effects:</i> Constructs an object of type <tt>error_code</tt>.
15590 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == cat</tt>.
15593 <i>Throws:</i> Nothing.
15598 Change 19.4.2.3 [syserr.errcode.modifiers] Class <tt>error_code</tt> modifiers as indicated:
15602 <pre>void assign(int val, const error_category<del>&</del><ins>*</ins> cat);
15605 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == cat</tt>.
15608 <i>Throws:</i> Nothing.
15613 Change 19.4.2.4 [syserr.errcode.observers] Class <tt>error_code</tt> observers as indicated:
15617 <pre>const error_category<del>&</del><ins>*</ins> category() const;
15621 <i>Returns:</i> <tt>cat_</tt>.
15624 <i>Throws:</i> Nothing.
15629 Change 19.4.3.1 [syserr.errcondition.overview] Class <tt>error_condition</tt> overview as indicated:
15633 <pre>class error_condition {
15636 <ins>constexpr</ins> error_condition(int val, const error_category<del>&</del><ins>*</ins> cat);
15638 void assign(int val, const error_category<del>&</del><ins>*</ins> cat);
15640 const error_category<del>&</del><ins>*</ins> category() const;
15643 int val_; // exposition only
15644 const error_category<del>&</del><ins>*</ins> cat_; // exposition only
15649 Change 19.4.3.2 [syserr.errcondition.constructors] Class <tt>error_condition</tt> constructors as indicated:
15653 <pre><ins>constexpr</ins> error_condition(int val, const error_category<del>&</del><ins>*</ins> cat);
15656 <i>Effects:</i> Constructs an object of type <tt>error_condition</tt>.
15659 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == cat</tt>.
15662 <i>Throws:</i> Nothing.
15667 Change 19.4.3.3 [syserr.errcondition.modifiers] Class <tt>error_condition</tt> modifiers as indicated:
15671 <pre>void assign(int val, const error_category<del>&</del><ins>*</ins> cat);
15674 <i>Postconditions:</i> <tt>val_ == val</tt> and <tt>cat_ == cat</tt>.
15677 <i>Throws:</i> Nothing.
15682 Change 19.4.3.4 [syserr.errcondition.observers] Class <tt>error_condition</tt> observers as indicated:
15686 <pre>const error_category<del>&</del><ins>*</ins> category() const;
15689 <i>Returns:</i> <tt>cat_</tt>.
15692 <i>Throws:</i> Nothing.
15697 Throughout 19.4 [syserr] System error support, change "<tt>category().</tt>" to "<tt>category()-></tt>".
15698 Appears approximately six times.
15702 <i>[Partially Editorial]</i> In 19.4.4 [syserr.compare] Comparison operators,
15703 paragraphs 2 and 4, change "<tt>category.equivalent(</tt>" to
15704 "<tt>category()->equivalent(</tt>".
15708 Change 19.4.5.1 [syserr.syserr.overview] Class system_error overview as indicated:
15711 <blockquote><pre>public:
15712 system_error(error_code ec, const string& what_arg);
15713 system_error(error_code ec);
15714 system_error(int ev, const error_category<del>&</del><ins>*</ins> ecat,
15715 const string& what_arg);
15716 system_error(int ev, const error_category<del>&</del><ins>*</ins> ecat);
15717 </pre></blockquote>
15720 Change 19.4.5.2 [syserr.syserr.members] Class system_error members as indicated:
15724 <pre>system_error(int ev, const error_category<del>&</del><ins>*</ins> ecat, const string& what_arg);
15728 <i>Effects:</i> Constructs an object of class <tt>system_error</tt>.
15731 <i>Postconditions:</i> <tt>code() == error_code(ev, ecat)</tt> and
15732 <tt>strcmp(runtime_error::what(), what_arg.c_str()) == 0</tt>.
15736 <pre>system_error(int ev, const error_category<del>&</del><ins>*</ins> ecat);
15740 <i>Effects:</i> Constructs an object of class <tt>system_error</tt>.
15743 <i>Postconditions:</i> <tt>code() == error_code(ev, ecat)</tt> and
15744 <tt>strcmp(runtime_error::what(), "") == 0</tt>.
15755 <h3><a name="833"></a>833. Freestanding implementations header list needs review for C++0x</h3>
15756 <p><b>Section:</b> 17.4.1.3 [compliance] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15757 <b>Submitter:</b> Beman Dawes <b>Date:</b> 2008-05-14</p>
15758 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
15759 <p><b>Discussion:</b></p>
15761 Once the C++0x standard library is feature complete, the LWG needs to
15762 review 17.4.1.3 [compliance] Freestanding implementations header list to
15763 ensure it reflects LWG consensus.
15767 <p><b>Proposed resolution:</b></p>
15774 <h3><a name="834"></a>834. Unique_ptr::pointer requirements underspecified</h3>
15775 <p><b>Section:</b> 20.7.11.2 [unique.ptr.single] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15776 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-05-14</p>
15777 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
15778 <p><b>Discussion:</b></p>
15780 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a> (including recent updates by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#821">821</a>) proposes a useful
15781 extension point for <tt>unique_ptr</tt> by granting support for an optional
15782 <tt>deleter_type::pointer</tt> to act as pointer-like replacement for <tt>element_type*</tt>
15783 (In the following: <tt>pointer</tt>).
15786 Unfortunately no requirements are specified for the type <tt>pointer</tt> which has
15787 impact on at least two key features of <tt>unique_ptr</tt>:
15791 <li>Operational fail-safety.</li>
15792 <li>(Well-)Definedness of expressions.</li>
15796 <tt>Unique_ptr</tt> specification makes great efforts to require that essentially *all*
15797 operations cannot throw and therefore adds proper wording to the affected
15798 operations of the deleter as well. If user-provided <tt>pointer</tt>-emulating types
15799 ("smart pointers") will be allowed, either *all* throw-nothing clauses have to
15800 be replaced by weaker "An exception is thrown only if <tt>pointer</tt>'s {op} throws
15801 an exception"-clauses or it has to be said explicitly that all used
15803 <tt>pointer</tt> are required *not* to throw. I understand the main focus of <tt>unique_ptr</tt>
15804 to be as near as possible to the advantages of native pointers which cannot
15805 fail and thus strongly favor the second choice. Also, the alternative position
15806 would make it much harder to write safe and simple template code for
15807 <tt>unique_ptr</tt>. Additionally, I assume that a general statement need to be given
15808 that all of the expressions of <tt>pointer</tt> used to define semantics are required to
15809 be well-formed and well-defined (also as back-end for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#762">762</a>).
15819 Howard: We maybe need a core concept <tt>PointerLike</tt>, but we don't need the
15820 arithmetic (see <tt>shared_ptr</tt> vs. <tt>vector<T>::iterator</tt>.
15823 Howard will go through and enumerate the individual requirements wrt. <tt>pointer</tt> for each member function.
15829 <p><b>Proposed resolution:</b></p>
15831 Add the following sentence just at the end of the newly proposed
15832 20.7.11.2 [unique.ptr.single]/p. 3:
15836 <tt>unique_ptr<T, D>::pointer</tt>'s operations shall be well-formed, shall have well
15837 defined behavior, and shall not throw exceptions.
15845 <h3><a name="835"></a>835. tying two streams together (correction to DR 581)</h3>
15846 <p><b>Section:</b> 27.4.4.2 [basic.ios.members] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
15847 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-05-17</p>
15848 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#basic.ios.members">active issues</a> in [basic.ios.members].</p>
15849 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#basic.ios.members">issues</a> in [basic.ios.members].</p>
15850 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
15851 <p><b>Discussion:</b></p>
15855 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#581">581</a>,
15856 now integrated into the working paper, overlooks a couple of minor
15862 First, being an unformatted function once again, <code>flush()</code>
15863 is required to create a sentry object whose constructor must, among
15864 other things, flush the tied stream. When two streams are tied
15865 together, either directly or through another intermediate stream
15866 object, flushing one will also cause a call to <code>flush()</code> on
15867 the other tied stream(s) and vice versa, ad infinitum. The program
15868 below demonstrates the problem.
15873 Second, as Bo Persson notes in his
15874 comp.lang.c++.moderated <a href="http://groups.google.com/group/comp.lang.c++.moderated/tree/browse_frm/thread/f2187794e9cc036d/305df31dc583054a">post</a>,
15875 for streams with the <code>unitbuf</code> flag set such
15876 as <code>std::stderr</code>, the destructor of the sentry object will
15877 again call <code>flush()</code>. This seems to create an infinite
15878 recursion for <code>std::cerr << std::flush;</code>
15882 <pre>#include <iostream>
15886 std::cout.tie (&std::cerr);
15887 std::cerr.tie (&std::cout);
15888 std::cout << "cout\n";
15889 std::cerr << "cerr\n";
15894 <p><b>Proposed resolution:</b></p>
15897 I think an easy way to plug the first hole is to add a requires clause
15898 to <code>ostream::tie(ostream *tiestr)</code> requiring the this
15899 pointer not be equal to any pointer on the list starting
15900 with <code>tiestr->tie()</code>
15901 through <code>tiestr()->tie()->tie()</code> and so on. I am not
15902 proposing that we require implementations to traverse this list,
15903 although I think we could since the list is unlikely to be very long.
15908 Add a <i>Requires</i> clause to 27.4.4.2 [basic.ios.members] withethe following
15914 <i>Requires:</i> If <code>(tiestr != 0)</code> is
15915 true, <code>tiestr</code> must not be reachable by traversing the
15916 linked list of tied stream objects starting
15917 from <code>tiestr->tie()</code>.
15922 In addition, to prevent the infinite recursion that Bo writes about in
15923 his comp.lang.c++.moderated post, I propose to change
15924 27.6.2.4 [ostream::sentry], p2 like so:
15929 If <code>((os.flags() & ios_base::unitbuf) &&
15930 !uncaught_exception())</code> is true,
15931 calls <del>os.flush()</del> <ins><code>os.rdbuf()->pubsync()</code></ins>.
15939 <h3><a name="836"></a>836.
15940 effects of <code>money_base::space</code> and
15941 <code>money_base::none</code> on <code>money_get</code>
15943 <p><b>Section:</b> 22.2.6.1.2 [locale.money.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
15944 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-05-17</p>
15945 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#locale.money.get.virtuals">active issues</a> in [locale.money.get.virtuals].</p>
15946 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#locale.money.get.virtuals">issues</a> in [locale.money.get.virtuals].</p>
15947 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
15948 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#670">670</a></p>
15949 <p><b>Discussion:</b></p>
15952 In paragraph 2, 22.2.6.1.2 [locale.money.get.virtuals] specifies the following:
15957 Where <code>space</code> or <code>none</code> appears in the format
15958 pattern, except at the end, optional white space (as recognized
15959 by <code>ct.is</code>) is consumed after any required space.
15964 This requirement can be (and has been) interpreted two mutually
15965 exclusive ways by different readers. One possible interpretation
15973 where <code>money_base::space</code> appears in the format, at least
15974 one space is required, and
15979 where <code>money_base::none</code> appears in the format, space is
15980 allowed but not required.
15992 where either <code>money_base::space</code> or <code>money_base::none</code> appears in the format, white space is optional.
15997 <p><b>Proposed resolution:</b></p>
16000 I propose to change the text to make it clear that the first
16001 interpretation is intended, that is, to make following change to
16002 22.2.6.1.2 [locale.money.get.virtuals], p2:
16008 When <code><ins>money_base::</ins>space</code>
16009 or <code><ins>money_base::</ins>none</code> appears <ins>as the last
16010 element </ins>in the format pattern, <del>except at the end, optional
16011 white space (as recognized by <code>ct.is</code>) is consumed after
16012 any required space.</del> <ins>no white space is consumed. Otherwise,
16013 where <code>money_base::space</code> appears in any of the initial
16014 elements of the format pattern, at least one white space character is
16015 required. Where <code>money_base::none</code> appears in any of the
16016 initial elements of the format pattern, white space is allowed but not
16017 required. In either case, any required followed by all optional white
16018 space (as recognized by <code>ct.is()</code>) is consumed.</ins>
16019 If <code>(str.flags() & str.showbase)</code> is <code>false</code>, ...
16027 <h3><a name="837"></a>837.
16028 <code>basic_ios::copyfmt()</code> overly loosely specified
16030 <p><b>Section:</b> 27.4.4.2 [basic.ios.members] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
16031 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-05-17</p>
16032 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#basic.ios.members">active issues</a> in [basic.ios.members].</p>
16033 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#basic.ios.members">issues</a> in [basic.ios.members].</p>
16034 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
16035 <p><b>Discussion:</b></p>
16038 The <code>basic_ios::copyfmt()</code> member function is specified in 27.4.4.2 [basic.ios.members] to have the following effects:
16043 <i>Effects</i>: If <code>(this == &rhs)</code> does
16044 nothing. Otherwise assigns to the member objects of <code>*this</code>
16045 the corresponding member objects of <code>rhs</code>, except that
16050 <code>rdstate()</code> and <code>rdbuf()</code> are left unchanged;
16055 <code>exceptions()</code> is altered last by
16056 calling <code>exceptions(rhs.except)</code>
16061 the contents of arrays pointed at by <code>pword</code>
16062 and <code>iword</code> are copied not the pointers themselves
16069 Since the rest of the text doesn't specify what the member objects
16070 of <code>basic_ios</code> are this seems a little too loose.
16075 <p><b>Proposed resolution:</b></p>
16078 I propose to tighten things up by adding a <i>Postcondition</i> clause
16079 to the function like so:
16083 <i>Postconditions:</i>
16088 <th colspan="2"><code>copyfmt()</code> postconditions</th>
16097 <td><code>rdbuf()</code></td>
16098 <td><i>unchanged</i></td>
16101 <td><code>tie()</code></td>
16102 <td><code>rhs.tie()</code></td>
16105 <td><code>rdstate()</code></td>
16106 <td><i>unchanged</i></td>
16109 <td><code>exceptions()</code></td>
16110 <td><code>rhs.exceptions()</code></td>
16113 <td><code>flags()</code></td>
16114 <td><code>rhs.flags()</code></td>
16117 <td><code>width()</code></td>
16118 <td><code>rhs.width()</code></td>
16121 <td><code>precision()</code></td>
16122 <td><code>rhs.precision()</code></td>
16125 <td><code>fill()</code></td>
16126 <td><code>rhs.fill()</code></td>
16129 <td><code>getloc()</code></td>
16130 <td><code>rhs.getloc()</code></td>
16137 The format of the table follows Table 117 (as
16138 of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2588.pdf">N2588</a>): <code>basic_ios::init()</code>
16144 The intent of the new table is not to impose any new requirements or
16145 change existing ones, just to be more explicit about what I believe is
16154 <h3><a name="838"></a>838.
16155 can an <i>end-of-stream</i> iterator become a <i>non-end-of-stream</i> one?
16157 <p><b>Section:</b> 24.5.1 [istream.iterator] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
16158 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-05-17</p>
16159 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#istream.iterator">active issues</a> in [istream.iterator].</p>
16160 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#istream.iterator">issues</a> in [istream.iterator].</p>
16161 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
16162 <p><b>Discussion:</b></p>
16165 From message c++std-lib-20003...
16170 The description of <code>istream_iterator</code> in
16171 24.5.1 [istream.iterator], p1 specifies that objects of the
16172 class become the <i>end-of-stream</i> (EOS) iterators under the
16173 following condition (see also issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#836">836</a> another problem
16174 with this paragraph):
16179 If the end of stream is reached (<code>operator void*()</code> on the
16180 stream returns <code>false</code>), the iterator becomes equal to
16181 the <i>end-of-stream</i> iterator value.
16186 One possible implementation approach that has been used in practice is
16187 for the iterator to set its <code>in_stream</code> pointer to 0 when
16188 it reaches the end of the stream, just like the default ctor does on
16189 initialization. The problem with this approach is that
16190 the <i>Effects</i> clause for <code>operator++()</code> says the
16191 iterator unconditionally extracts the next value from the stream by
16192 evaluating <code>*in_stream >> value</code>, without checking
16193 for <code>(in_stream == 0)</code>.
16198 Conformance to the requirement outlined in the <i>Effects</i> clause
16199 can easily be verified in programs by setting <code>eofbit</code>
16200 or <code>failbit</code> in <code>exceptions()</code> of the associated
16201 stream and attempting to iterate past the end of the stream: each
16202 past-the-end access should trigger an exception. This suggests that
16203 some other, more elaborate technique might be intended.
16208 Another approach, one that allows <code>operator++()</code> to attempt
16209 to extract the value even for EOS iterators (just as long
16210 as <code>in_stream</code> is non-0) is for the iterator to maintain a
16211 flag indicating whether it has reached the end of the stream. This
16212 technique would satisfy the presumed requirement implied by
16213 the <i>Effects</i> clause mentioned above, but it isn't supported by
16214 the exposition-only members of the class (no such flag is shown). This
16215 approach is also found in existing practice.
16220 The inconsistency between existing implementations raises the question
16221 of whether the intent of the specification is that a non-EOS iterator
16222 that has reached the EOS become a non-EOS one again after the
16223 stream's <code>eofbit</code> flag has been cleared? That is, are the
16224 assertions in the program below expected to pass?
16228 <pre> sstream strm ("1 ");
16229 istream_iterator eos;
16230 istream_iterator it (strm);
16233 assert (it == eos);
16235 strm << "2 3 ";
16236 assert (it != eos);
16243 Or is it intended that once an iterator becomes EOS it stays EOS until
16244 the end of its lifetime?
16249 <p><b>Proposed resolution:</b></p>
16252 The discussion of this issue on the reflector suggests that the intent
16253 of the standard is for an <code>istreambuf_iterator</code> that has
16254 reached the EOS to remain in the EOS state until the end of its
16255 lifetime. Implementations that permit EOS iterators to return to a
16256 non-EOS state may only do so as an extension, and only as a result of
16257 calling <code>istream_iterator</code> member functions on EOS
16258 iterators whose behavior is in this case undefined.
16263 To this end we propose to change 24.5.1 [istream.iterator], p1,
16269 The result of operator-> on an end<ins>-</ins>of<ins>-</ins>stream
16270 is not defined. For any other iterator value a <code>const T*</code>
16271 is returned.<ins> Invoking <code>operator++()</code> on
16272 an <i>end-of-stream</i> iterator is undefined.</ins> It is impossible
16273 to store things into istream iterators...
16278 Add pre/postconditions to the member function descriptions of <code>istream_iterator</code> like so:
16283 <pre>istream_iterator();</pre>
16285 <i>Effects</i>: Constructs the <i>end-of-stream</i> iterator.<br>
16286 <ins><i>Postcondition</i>: <code>in_stream == 0</code>.</ins>
16288 <pre>istream_iterator(istream_type &s);</pre>
16290 <i>Effects</i>: Initializes <code>in_stream</code> with &s. value
16291 may be initialized during construction or the first time it is
16293 <ins><i>Postcondition</i>: <code>in_stream == &s</code>.</ins>
16295 <pre>istream_iterator(const istream_iterator &x);</pre>
16297 <i>Effects</i>: Constructs a copy of <code>x</code>.<br>
16298 <ins><i>Postcondition</i>: <code>in_stream == x.in_stream</code>.</ins>
16300 <pre>istream_iterator& operator++();</pre>
16302 <ins><i>Requires</i>: <code>in_stream != 0</code>.</ins><br>
16303 <i>Effects</i>: <code>*in_stream >> value</code>.
16305 <pre>istream_iterator& operator++(int);</pre>
16307 <ins><i>Requires</i>: <code>in_stream != 0</code>.</ins><br>
16309 <blockquote><pre>istream_iterator tmp (*this);
16310 *in_stream >> value;
16320 <h3><a name="839"></a>839. Maps and sets missing splice operation</h3>
16321 <p><b>Section:</b> 23.3 [associative], 23.4 [unord] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16322 <b>Submitter:</b> Alan Talbot <b>Date:</b> 2008-05-18</p>
16323 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Open">Open</a> status.</p>
16324 <p><b>Discussion:</b></p>
16326 Splice is a very useful feature of <tt>list</tt>. This functionality is also very
16327 useful for any other node based container, and I frequently wish it were
16328 available for maps and sets. It seems like an omission that these
16329 containers lack this capability. Although the complexity for a splice is
16330 the same as for an insert, the actual time can be much less since the
16331 objects need not be reallocated and copied. When the element objects are
16332 heavy and the compare operations are fast (say a <tt>map<int, huge_thingy></tt>)
16333 this can be a big win.
16337 <b>Suggested resolution:</b>
16341 Add the following signatures to map, set, multimap, multiset, and the unordered associative containers:
16344 void splice(list<T,Allocator>&& x);
16345 void splice(list<T,Allocator>&& x, const_iterator i);
16346 void splice(list<T,Allocator>&& x, const_iterator first, const_iterator last);
16347 </pre></blockquote>
16350 Hint versions of these are also useful to the extent hint is useful.
16351 (I'm looking for guidance about whether hints are in fact useful.)
16355 void splice(const_iterator position, list<T,Allocator>&& x);
16356 void splice(const_iterator position, list<T,Allocator>&& x, const_iterator i);
16357 void splice(const_iterator position, list<T,Allocator>&& x, const_iterator first, const_iterator last);
16358 </pre></blockquote>
16367 Don't try to <tt>splice "list"</tt> into the other containers, it should be container-type.
16370 <tt>forward_list</tt> already has <tt>splice_after</tt>.
16373 Would "<tt>splice</tt>" make sense for an <tt>unordered_map</tt>?
16376 Jens, Robert: "<tt>splice</tt>" is not the right term, it implies maintaining ordering in <tt>list</tt>s.
16379 Howard: <tt>adopt</tt>?
16382 Jens: <tt>absorb</tt>?
16385 Alan: <tt>subsume</tt>?
16388 Robert: <tt>recycle</tt>?
16391 Howard: <tt>transfer</tt>? (but no direction)
16394 Jens: <tt>transfer_from</tt>. No.
16397 Alisdair: Can we give a nothrow guarantee? If your <tt>compare()</tt> and <tt>hash()</tt> doesn't throw, yes.
16400 Daniel: For <tt>unordered_map</tt>, we can't guarantee nothrow.
16406 <p><b>Proposed resolution:</b></p>
16413 <h3><a name="841"></a>841. cstdint.syn inconsistent with C99</h3>
16414 <p><b>Section:</b> 18.3.1 [cstdint.syn] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
16415 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-05-17</p>
16416 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#cstdint.syn">issues</a> in [cstdint.syn].</p>
16417 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
16418 <p><b>Discussion:</b></p>
16421 In specifying the names of macros and types defined in
16422 header <code><stdint.h></code>, C99 makes use of the
16423 symbol <code><i>N</i></code> to accommodate unusual platforms with
16424 word sizes that aren't powers of two. C99
16425 permits <code><i>N</i></code> to take on any positive integer value
16426 (including, for example, 24).
16431 In cstdint.syn Header <code><cstdint></code>
16432 synopsis, C++ on the other hand, fixes the value
16433 of <code><i>N</i></code> to 8, 16, 32, and 64, and specifies only
16434 types with these exact widths.
16440 In addition, paragraph 1 of the same section makes use of a rather
16441 informal shorthand notation to specify sets of macros. When
16442 interpreted strictly, the notation specifies macros such
16443 as <code>INT_8_MIN</code> that are not intended to be specified.
16447 Finally, the section is missing the usual table of symbols defined
16448 in that header, making it inconsistent with the rest of the
16453 <p><b>Proposed resolution:</b></p>
16456 I propose to use the same approach in the C++ spec as C99 uses, that
16457 is, to specify the header synopsis in terms of "exposition only" types
16458 that make use of the symbol <code><i>N</i></code> to denote one or
16459 more of a theoretically unbounded set of widths.
16464 Further, I propose to add a new table to section listing the symbols
16465 defined in the header using a more formal notation that avoids
16466 introducing inconsistencies.
16471 To this effect, in cstdint.syn
16472 Header <code><cstdint></code> synopsis, replace both the
16473 synopsis and paragraph 1 with the following text:
16481 In the names defined in the <code><cstdint></code> header, the
16482 symbol <code><i>N</i></code> represents a positive decimal integer
16483 with no leading zeros (e.g., 8 or 24, but not 0, 04, or 048). With the
16484 exception of exact-width types, macros and types for values
16485 of <code><i>N</i></code> in the set of 8, 16, 32, and 64 are
16486 required. Exact-width types, and any macros and types for values
16487 of <code><i>N</i></code> other than 8, 16, 32, and 64 are
16488 optional. However, if an implementation provides integer types with
16489 widths of 8, 16, 32, or 64 bits, the corresponding exact-width types
16490 and macros are required.
16495 <pre>namespace std {
16499 // Fastest minimum-width integer types
16500 typedef <i>signed integer type</i> int_fast8_t;
16501 typedef <i>signed integer type</i> int_fast16_t;
16502 typedef <i>signed integer type</i> int_fast32_t;
16503 typedef <i>signed integer type</i> int_fast64_t;
16505 typedef <i>unsigned integer type</i> uint_fast8_t;
16506 typedef <i>unsigned integer type</i> uint_fast16_t;
16507 typedef <i>unsigned integer type</i> uint_fast32_t;
16508 typedef <i>unsigned integer type</i> uint_fast64_t;
16510 // Minimum-width integer types
16511 typedef <i>signed integer type</i> int_least8_t;
16512 typedef <i>signed integer type</i> int_least16_t;
16513 typedef <i>signed integer type</i> int_least32_t;
16514 typedef <i>signed integer type</i> int_least64_t;
16516 typedef <i>unsigned integer type</i> uint_least8_t;
16517 typedef <i>unsigned integer type</i> uint_least16_t;
16518 typedef <i>unsigned integer type</i> uint_least32_t;
16519 typedef <i>unsigned integer type</i> uint_least64_t;
16521 // Greatest-width integer types
16522 typedef <i>signed integer type</i> intmax_t;
16523 typedef <i>unsigned integer type</i> uintmax_t;
16525 // optionally defined types
16527 // Exact-width integer types
16528 typedef <i>signed integer type</i> int<i>N</i>_t;
16529 typedef <i>unsigned integer type</i> uint<i>N</i>_t;
16531 // Fastest minimum-width integer types for values
16532 // of <i>N</i> other than 8, 16, 32, and 64
16533 typedef <i>signed integer type</i> uint_fast<i>N</i>_t;
16534 typedef <i>unsigned integer type</i> uint_fast<i>N</i>_t;
16536 // Minimum-width integer types for values
16537 // of <i>N</i> other than 8, 16, 32, and 64
16538 typedef <i>signed integer type</i> uint_least<i>N</i>_t;
16539 typedef <i>unsigned integer type</i> uint_least<i>N</i>_t;
16541 // Integer types capable of holding object pointers
16542 typedef <i>signed integer type</i> intptr_t;
16543 typedef <i>signed integer type</i> intptr_t;
16549 [Note to editor: Remove all of the existing paragraph 1 from cstdint.syn.]
16553 Table ??: Header <code><cstdint></code> synopsis
16558 <th colspan="3">Name(s)</th>
16563 <td rowspan="11"><b>Macros:</b></td>
16564 <td><tt>INT<i>N</i>_MIN</tt></td>
16565 <td><tt>INT<i>N</i>_MAX</tt></td>
16566 <td><tt>UINT<i>N</i>_MAX</tt></td>
16569 <td><tt>INT_FAST<i>N</i>_MIN</tt></td>
16570 <td><tt>INT_FAST<i>N</i>_MAX</tt></td>
16571 <td><tt>UINT_FAST<i>N</i>_MAX</tt></td>
16574 <td><tt>INT_LEAST<i>N</i>_MIN</tt></td>
16575 <td><tt>INT_LEAST<i>N</i>_MAX</tt></td>
16576 <td><tt>UINT_LEAST<i>N</i>_MAX</tt></td>
16579 <td><tt>INTPTR_MIN</tt></td>
16580 <td><tt>INTPTR_MAX</tt></td>
16581 <td><tt>UINTPTR_MAX</tt></td>
16584 <td><tt>INTMAX_MIN</tt></td>
16585 <td><tt>INTMAX_MAX</tt></td>
16586 <td><tt>UINTMAX_MAX</tt></td>
16589 <td><tt>PTRDIFF_MIN</tt></td>
16590 <td><tt>PTRDIFF_MAX</tt></td>
16591 <td><tt>PTRDIFF_MAX</tt></td>
16594 <td><tt>SIG_ATOMIC_MIN</tt></td>
16595 <td><tt>SIG_ATOMIC_MAX</tt></td>
16596 <td><tt>SIZE_MAX</tt></td>
16599 <td><tt>WCHAR_MIN</tt></td>
16600 <td><tt>WCHAR_MAX</tt></td>
16604 <td><tt>WINT_MIN</tt></td>
16605 <td><tt>WINT_MAX</tt></td>
16609 <td><tt>INT<i>N</i>_C()</tt></td>
16610 <td><tt>UINT<i>N</i>_C()</tt></td>
16614 <td><tt>INTMAX_C()</tt></td>
16615 <td><tt>UINTMAX_C()</tt></td>
16619 <td rowspan="5"><b>Types:</b></td>
16620 <td><tt>int<i>N</i>_t</tt></td>
16621 <td><tt>uint<i>N</i>_t</tt></td>
16625 <td><tt>int_fast<i>N</i>_t</tt></td>
16626 <td><tt>uint_fast<i>N</i>_t</tt></td>
16630 <td><tt>int_least<i>N</i>_t</tt></td>
16631 <td><tt>uint_least<i>N</i>_t</tt></td>
16635 <td><tt>intptr_t</tt></td>
16636 <td><tt>uintptr_t</tt></td>
16640 <td><tt>intmax_t</tt></td>
16641 <td><tt>uintmax_t</tt></td>
16653 <h3><a name="842"></a>842. ConstructibleAsElement and bit containers</h3>
16654 <p><b>Section:</b> 23.1 [container.requirements], 23.2.7 [vector.bool], 23.3.5 [template.bitset] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
16655 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2008-06-03</p>
16656 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements">active issues</a> in [container.requirements].</p>
16657 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements">issues</a> in [container.requirements].</p>
16658 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
16659 <p><b>Discussion:</b></p>
16661 23.1 [container.requirements]/p3 says:
16665 Objects stored in these components shall be constructed using
16666 <tt>construct_element</tt> (20.6.9). For each operation that inserts an
16667 element of type <tt>T</tt> into a container (<tt>insert</tt>,
16668 <tt>push_back</tt>, <tt>push_front</tt>, <tt>emplace</tt>, etc.) with
16669 arguments <tt>args... T</tt> shall be <tt>ConstructibleAsElement</tt>,
16670 as described in table 88. [<i>Note:</i> If the component is instantiated
16671 with a scoped allocator of type <tt>A</tt> (i.e., an allocator for which
16672 <tt>is_scoped_allocator<A>::value</tt> is <tt>true</tt>), then
16673 <tt>construct_element</tt> may pass an inner allocator argument to
16674 <tt>T</tt>'s constructor. <i>-- end note</i>]
16678 However <tt>vector<bool, A></tt> (23.2.7 [vector.bool]) and <tt>bitset<N></tt>
16679 (23.3.5 [template.bitset]) store bits, not <tt>bool</tt>s, and <tt>bitset<N></tt>
16680 does not even have an allocator. But these containers are governed by this clause. Clearly this
16681 is not implementable.
16685 <p><b>Proposed resolution:</b></p>
16687 Change 23.1 [container.requirements]/p3:
16691 Objects stored in these components shall be constructed using
16692 <tt>construct_element</tt> (20.6.9)<ins>, unless otherwise specified</ins>.
16693 For each operation that inserts an
16694 element of type <tt>T</tt> into a container (<tt>insert</tt>,
16695 <tt>push_back</tt>, <tt>push_front</tt>, <tt>emplace</tt>, etc.) with
16696 arguments <tt>args... T</tt> shall be <tt>ConstructibleAsElement</tt>,
16697 as described in table 88. [<i>Note:</i> If the component is instantiated
16698 with a scoped allocator of type <tt>A</tt> (i.e., an allocator for which
16699 <tt>is_scoped_allocator<A>::value</tt> is <tt>true</tt>), then
16700 <tt>construct_element</tt> may pass an inner allocator argument to
16701 <tt>T</tt>'s constructor. <i>-- end note</i>]
16705 Change 23.2.7 [vector.bool]/p2:
16709 Unless described below, all operations have the same requirements and semantics as the primary <tt>vector</tt> template,
16710 except that operations dealing with the <tt>bool</tt> value type map to bit values in the container storage<ins>,
16711 and <tt>construct_element</tt> (23.1 [container.requirements]) is not used to construct these values</ins>.
16715 Move 23.3.5 [template.bitset] to clause 20.
16724 <h3><a name="843"></a>843. Reference Closure</h3>
16725 <p><b>Section:</b> 20.6.17.1 [func.referenceclosure.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
16726 <b>Submitter:</b> Lawrence Crowl <b>Date:</b> 2008-06-02</p>
16727 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
16728 <p><b>Discussion:</b></p>
16730 The <tt>std::reference_closure</tt> type has a deleted copy assignment operator
16731 under the theory that references cannot be assigned, and hence the
16732 assignment of its reference member must necessarily be ill-formed.
16735 However, other types, notably <tt>std::reference_wrapper</tt> and <tt>std::function</tt>
16736 provide for the "copying of references", and thus the current definition
16737 of <tt>std::reference_closure</tt> seems unnecessarily restrictive. In particular,
16738 it should be possible to write generic functions using both <tt>std::function</tt>
16739 and <tt>std::reference_closure</tt>, but this generality is much harder when
16740 one such type does not support assignment.
16743 The definition of <tt>reference_closure</tt> does not necessarily imply direct
16744 implementation via reference types. Indeed, the <tt>reference_closure</tt> is
16745 best implemented via a frame pointer, for which there is no standard
16749 The semantics of assignment are effectively obtained by use of the
16750 default destructor and default copy assignment operator via
16753 <blockquote><pre>x.~reference_closure(); new (x) reference_closure(y);
16754 </pre></blockquote>
16757 So the copy assignment operator generates no significant real burden
16758 to the implementation.
16762 <p><b>Proposed resolution:</b></p>
16764 In 20.6.17 [func.referenceclosure] Class template reference_closure,
16765 replace the <tt>=delete</tt> in the copy assignment operator in the synopsis
16766 with <tt>=default</tt>.
16769 <blockquote><pre>template<class R , class... ArgTypes >
16770 class reference_closure<R (ArgTypes...)> {
16773 reference_closure& operator=(const reference_closure&) = <del>delete</del> <ins>default</ins>;
16775 </pre></blockquote>
16778 In 20.6.17.1 [func.referenceclosure.cons] Construct, copy, destroy,
16779 add the member function description
16783 <pre>reference_closure& operator=(const reference_closure& f)
16787 <i>Postcondition:</i> <tt>*this</tt> is a copy of <tt>f</tt>.
16790 <i>Returns:</i> <tt>*this</tt>.
16802 <h3><a name="844"></a>844. <tt>complex pow</tt> return type is ambiguous</h3>
16803 <p><b>Section:</b> 26.3.9 [cmplx.over] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
16804 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2008-06-03</p>
16805 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
16806 <p><b>Discussion:</b></p>
16808 The current working draft is in an inconsistent state.
16812 26.3.8 [complex.transcendentals] says that:
16816 <tt>pow(complex<float>(), int())</tt> returns a <tt>complex<float></tt>.
16820 26.3.9 [cmplx.over] says that:
16824 <tt>pow(complex<float>(), int())</tt> returns a <tt>complex<double></tt>.
16834 Since <tt>int</tt> promotes to <tt>double</tt>, and C99 doesn't have an <tt>int</tt>-based
16835 overload for <tt>pow</tt>, the C99 result is <tt>complex<double></tt>, see also C99
16836 7.22, see also library issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#550">550</a>.
16839 Special note: ask P.J. Plauger.
16847 <p><b>Proposed resolution:</b></p>
16849 Strike this <tt>pow</tt> overload in 26.3.1 [complex.synopsis] and in 26.3.8 [complex.transcendentals]:
16852 <blockquote><pre><del>template<class T> complex<T> pow(const complex<T>& x, int y);</del>
16853 </pre></blockquote>
16860 <h3><a name="845"></a>845. atomics cannot support aggregate initialization</h3>
16861 <p><b>Section:</b> 29.3 [atomics.types] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
16862 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-06-03</p>
16863 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics.types">active issues</a> in [atomics.types].</p>
16864 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics.types">issues</a> in [atomics.types].</p>
16865 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
16866 <p><b>Discussion:</b></p>
16868 The atomic classes (and class templates) are required to support aggregate
16869 initialization (29.3.1 [atomics.types.integral]p2 / 29.3.2 [atomics.types.address]p1)
16870 yet also have user declared constructors, so cannot be aggregates.
16873 This problem might be solved with the introduction of the proposed
16874 initialization syntax at Antipolis, but the wording above should be altered.
16875 Either strike the sentence as redundant with new syntax, or refer to 'brace
16888 <blockquote><pre>atomic_itype a1 = { 5 };
16889 </pre></blockquote>
16891 would be aggregate-initialization syntax (now coming under the disguise
16892 of brace initialization), but would be ill-formed, because the corresponding
16893 constructor for atomic_itype is explicit. This works, though:
16895 <blockquote><pre>atomic_itype a2 { 6 };
16896 </pre></blockquote>
16901 <p><b>Proposed resolution:</b></p>
16903 In 29.3.1 [atomics.types.integral], strike the following sentence from paragraph 2:
16907 The atomic integral types shall have standard layout. They shall each have a trivial default constructor, a constexpr
16908 explicit value constructor, a deleted copy constructor, a deleted copy assignment operator, and a trivial destructor.
16909 <del>They shall each support aggregate initialization syntax.</del>
16913 2008-08-18, Lawrence adds:
16917 The syntactic compatibility of initialization with C is important.
16918 I suggest a different resolution; remove the explicit from the
16919 constructor. For the same reasons we can have implicit conversions,
16920 we can also have implicit constructors.
16928 <h3><a name="846"></a>846. No definition for constructor</h3>
16929 <p><b>Section:</b> 29.3 [atomics.types] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
16930 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-06-03</p>
16931 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics.types">active issues</a> in [atomics.types].</p>
16932 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics.types">issues</a> in [atomics.types].</p>
16933 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
16934 <p><b>Discussion:</b></p>
16936 The atomic classes and class templates (29.3.1 [atomics.types.integral] /
16937 29.3.2 [atomics.types.address]) have a constexpr
16938 constructor taking a value of the appropriate type for that atomic.
16939 However, neither clause provides semantics or a definition for this
16940 constructor. I'm not sure if the initialization is implied by use of
16941 constexpr keyword (which restricts the form of a constructor) but even if
16942 that is the case, I think it is worth spelling out explicitly as the
16943 inference would be far too subtle in that case.
16947 <p><b>Proposed resolution:</b></p>
16956 <h3><a name="847"></a>847. string exception safety guarantees</h3>
16957 <p><b>Section:</b> 21.3.1 [string.require] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
16958 <b>Submitter:</b> Hervé Brönnimann <b>Date:</b> 2008-06-05</p>
16959 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#string.require">issues</a> in [string.require].</p>
16960 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
16961 <p><b>Discussion:</b></p>
16963 In March, on comp.lang.c++.moderated, I asked what were the
16964 string exception safety guarantees are, because I cannot see
16965 *any* in the working paper, and any implementation I know offers
16966 the strong exception safety guarantee (string unchanged if a
16967 member throws exception). The closest the current draft comes to
16968 offering any guarantees is 21.3 [basic.string], para 3:
16972 The class template <tt>basic_string</tt> conforms to the requirements
16973 for a Sequence Container (23.1.1), for a Reversible Container (23.1),
16974 and for an Allocator-aware container (91). The iterators supported by
16975 <tt>basic_string</tt> are random access iterators (24.1.5).
16979 However, the chapter 23 only says, on the topic of exceptions: 23.1 [container.requirements],
16985 Unless otherwise specified (see 23.2.2.3 and 23.2.6.4) all container types defined in this clause meet the following
16986 additional requirements:
16990 <li>if an exception is thrown by...</li>
16995 I take it as saying that this paragraph has *no* implication on
16996 <tt>std::basic_string</tt>, as <tt>basic_string</tt> isn't defined in Clause 23 and
16997 this paragraph does not define a *requirement* of Sequence
16998 nor Reversible Container, just of the models defined in Clause 23.
16999 In addition, LWG Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#718">718</a> proposes to remove 23.1 [container.requirements], para 3.
17003 Finally, the fact that no operation on Traits should throw
17004 exceptions has no bearing, except to suggest (since the only
17005 other throws should be allocation, <tt>out_of_range</tt>, or <tt>length_error</tt>)
17006 that the strong exception guarantee can be achieved.
17010 The reaction in that group by Niels Dekker, Martin Sebor, and
17011 Bo Persson, was all that this would be worth an LWG issue.
17015 A related issue is that <tt>erase()</tt> does not throw. This should be
17016 stated somewhere (and again, I don't think that the 23.1 [container.requirements], para 1
17022 <p><b>Proposed resolution:</b></p>
17024 Add a blanket statement in 21.3.1 [string.require]:
17029 - if any member function or operator of <tt>basic_string<charT, traits, Allocator></tt>
17030 throws, that function or operator has no effect.
17033 - no <tt>erase()</tt> or <tt>pop_back()</tt> function throws.
17038 As far as I can tell, this is achieved by any implementation. If I made a
17039 mistake and it is not possible to offer this guarantee, then
17040 either state all the functions for which this is possible
17041 (certainly at least <tt>operator+=</tt>, <tt>append</tt>, <tt>assign</tt>, and <tt>insert</tt>),
17042 or add paragraphs to Effects clauses wherever appropriate.
17050 <h3><a name="848"></a>848. missing <tt>std::hash</tt> specializations for <tt>std::bitset/std::vector<bool></tt></h3>
17051 <p><b>Section:</b> 20.6.16 [unord.hash] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
17052 <b>Submitter:</b> Thorsten Ottosen <b>Date:</b> 2008-06-05</p>
17053 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
17054 <p><b>Discussion:</b></p>
17056 In the current working draft, <tt>std::hash<T></tt> is specialized for builtin
17057 types and a few other types. Bitsets seems like one that is missing from
17058 the list, not because it cannot not be done by the user, but because it
17059 is hard or impossible to write an efficient implementation that works on
17060 32bit/64bit chunks at a time. For example, <tt>std::bitset</tt> is too much
17061 encapsulated in this respect.
17065 <p><b>Proposed resolution:</b></p>
17067 Add the following to the synopsis in 20.6 [function.objects]/2:
17070 <blockquote><pre>template<class Allocator> struct hash<std::vector<bool,Allocator>>;
17071 template<size_t N> struct hash<std::bitset<N>>;
17072 </pre></blockquote>
17075 Modify the last sentence of 20.6.16 [unord.hash]/1 to end with:
17079 ... and <tt>std::string</tt>, <tt>std::u16string</tt>, <tt>std::u32string</tt>, <tt>std::wstring</tt>,
17080 <tt>std::error_code</tt>, <tt>std::thread::id</tt>, <tt>std::bitset</tt>, <tt>and std::vector<bool></tt>.
17089 <h3><a name="849"></a>849. missing type traits to compute root class and derived class of types in a class hierachy</h3>
17090 <p><b>Section:</b> 20.5.7 [meta.trans.other] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17091 <b>Submitter:</b> Thorsten Ottosen <b>Date:</b> 2008-06-05</p>
17092 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#meta.trans.other">active issues</a> in [meta.trans.other].</p>
17093 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#meta.trans.other">issues</a> in [meta.trans.other].</p>
17094 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17095 <p><b>Discussion:</b></p>
17097 The type traits library contains various traits to dealt with
17098 polymorphic types, e.g. <tt>std::has_virtual_destructor</tt>, <tt>std::is_polymorphic</tt>
17099 and <tt>std::is_base_of</tt>. However, there is no way to compute the unique
17100 public base class of a type if such one exists. Such a trait could be
17101 very useful if one needs to instantiate a specialization made for the
17102 root class whenever a derived class is passed as parameter. For example,
17103 imagine that you wanted to specialize <tt>std::hash</tt> for a class
17104 hierarchy---instead of specializing each class, you could specialize the
17105 <tt>std::hash<root_class></tt> and provide a partial specialization that worked
17106 for all derived classes.
17110 This ability---to specify operations in terms of their equivalent in the
17111 root class---can be done with e.g. normal functions, but there is,
17112 AFAIK, no way to do it for class templates. Being able to access
17113 compile-time information about the type-hierachy can be very powerful,
17114 and I therefore also suggest traits that computes the directly derived
17115 class whenever that is possible.
17119 If the computation can not be done, the traits should fall back on an
17120 identity transformation. I expect this gives the best overall usability.
17124 <p><b>Proposed resolution:</b></p>
17126 Add the following to the synopsis in 20.5.2 [meta.type.synop] under "other transformations":
17129 <blockquote><pre>template< class T > struct direct_base_class;
17130 template< class T > struct direct_derived_class;
17131 template< class T > struct root_base_class;
17132 </pre></blockquote>
17135 Add three new entries to table 51 (20.5.7 [meta.trans.other]) with the following content
17141 <th>Template</th><th>Condition</th><th>Comments</th>
17144 <td><tt>template< class T > struct direct_base_class;</tt></td>
17145 <td><tt>T</tt> shall be a complete type.</td>
17146 <td>The member typedef <tt>type</tt> shall equal the accessible unambiguous direct base class of <tt>T</tt>.
17147 If no such type exists, the member typedef <tt>type</tt> shall equal <tt>T</tt>.</td>
17150 <td><tt>template< class T > struct direct_derived_class;</tt></td>
17151 <td><tt>T</tt> shall be a complete type.</td>
17152 <td>The member typedef <tt>type</tt> shall equal the unambiguous type which has <tt>T</tt>
17153 as an accessible unambiguous direct base class. If no such type exists, the member typedef
17154 <tt>type</tt> shall equal <tt>T</tt>.</td>
17157 <td><tt>template< class T > struct root_base_class;</tt></td>
17158 <td><tt>T</tt> shall be a complete type.</td>
17159 <td>The member typedef <tt>type</tt> shall equal the accessible unambiguous most indirect base class of
17160 <tt>T</tt>. If no such type exists, the member typedef type shall equal <tt>T</tt>.</td>
17171 <h3><a name="850"></a>850. Should <tt>shrink_to_fit</tt> apply to <tt>std::deque</tt>?</h3>
17172 <p><b>Section:</b> 23.2.2.2 [deque.capacity] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
17173 <b>Submitter:</b> Niels Dekker <b>Date:</b> 2008-06-05</p>
17174 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#deque.capacity">active issues</a> in [deque.capacity].</p>
17175 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#deque.capacity">issues</a> in [deque.capacity].</p>
17176 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
17177 <p><b>Discussion:</b></p>
17179 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#755">755</a> added a <tt>shrink_to_fit</tt> function to <tt>std::vector</tt> and <tt>std::string</tt>.
17180 It did not yet deal with <tt>std::deque</tt>, because of the fundamental
17181 difference between <tt>std::deque</tt> and the other two container types. The
17182 need for <tt>std::deque</tt> may seem less evident, because one might think that
17183 for this container, the overhead is a small map, and some number of
17184 blocks that's bounded by a small constant.
17187 The container overhead can in fact be arbitrarily large (i.e. is not
17188 necessarily O(N) where N is the number of elements currently held by the
17189 <tt>deque</tt>). As Bill Plauger noted in a reflector message, unless the map of
17190 block pointers is shrunk, it must hold at least maxN/B pointers where
17191 maxN is the maximum of N over the lifetime of the <tt>deque</tt> since its
17192 creation. This is independent of how the map is implemented
17193 (<tt>vector</tt>-like circular buffer and all), and maxN bears no relation to N,
17194 the number of elements it currently holds.
17197 Hervé Brönnimann reports a situation where a <tt>deque</tt> of requests grew very
17198 large due to some temporary backup (the front request hanging), and the
17199 map of the <tt>deque</tt> grew quite large before getting back to normal. Just
17200 to put some color on it, assuming a <tt>deque</tt> with 1K pointer elements in
17201 steady regime, that held, at some point in its lifetime, maxN=10M
17202 pointers, with one block holding 128 elements, the spine must be at
17203 least (maxN / 128), in that case 100K. In that case, shrink-to-fit
17204 would allow to reuse about 100K which would otherwise never be reclaimed
17205 in the lifetime of the <tt>deque</tt>.
17208 An added bonus would be that it *allows* implementations to hang on to
17209 empty blocks at the end (but does not care if they do or not). A
17210 <tt>shrink_to_fit</tt> would take care of both shrinks, and guarantee that at
17211 most O(B) space is used in addition to the storage to hold the N
17212 elements and the N/B block pointers.
17216 <p><b>Proposed resolution:</b></p>
17218 To Class template deque 23.2.2 [deque] synopsis, add:
17220 <blockquote><pre>void shrink_to_fit();
17221 </pre></blockquote>
17224 To deque capacity 23.2.2.2 [deque.capacity], add:
17226 <blockquote><pre>void shrink_to_fit();
17230 <i>Remarks:</i> <tt>shrink_to_fit</tt> is a non-binding request to reduce memory
17231 use. [<i>Note:</i> The request is non-binding to allow latitude for
17232 implementation-specific optimizations. -- <i>end note</i>]
17241 <h3><a name="851"></a>851. simplified array construction</h3>
17242 <p><b>Section:</b> 23.2.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
17243 <b>Submitter:</b> Benjamin Kosnik <b>Date:</b> 2008-06-05</p>
17244 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#array">active issues</a> in [array].</p>
17245 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#array">issues</a> in [array].</p>
17246 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Review">Review</a> status.</p>
17247 <p><b>Discussion:</b></p>
17249 This is an issue that came up on the libstdc++ list, where a
17250 discrepency between "C" arrays and C++0x's <tt>std::array</tt> was pointed
17255 In "C," this array usage is possible:
17258 <blockquote><pre>int ar[] = {1, 4, 6};
17259 </pre></blockquote>
17265 <blockquote><pre>std::array<int> a = { 1, 4, 6 }; // error
17266 </pre></blockquote>
17269 Instead, the second parameter of the <tt>array</tt> template must be
17273 <blockquote><pre>std::array<int, 3> a = { 1, 4, 6 };
17274 </pre></blockquote>
17277 Doug Gregor proposes the following solution, that assumes
17278 generalized initializer lists.
17281 <blockquote><pre>template<typename T, typename... Args>
17282 inline array<T, sizeof...(Args)>
17283 make_array(Args&&... args)
17284 { return { std::forward<Args>(args)... }; }
17285 </pre></blockquote>
17288 Then, the way to build an <tt>array</tt> from a list of unknown size is:
17291 <blockquote><pre>auto a = make_array<T>(1, 4, 6);
17292 </pre></blockquote>
17296 <p><b>Proposed resolution:</b></p>
17298 Add to the <tt>array</tt> synopis in 23.2 [sequences]:
17301 <blockquote><pre>template<typename T, typename... Args>
17302 requires Convertible<Args, T>...
17303 array<T, sizeof...(Args)>
17304 make_array(Args&&... args);
17305 </pre></blockquote>
17308 Append after 23.2.1.6 [array.tuple] Tuple interface to class template <tt>array</tt> the
17309 following new section.
17314 23.2.1.7 Convenience interface to class template <tt>array</tt> [array.tuple]
17317 <pre>template<typename T, typename... Args>
17318 requires Convertible<Args, T>...
17319 array<T, sizeof...(Args)>
17320 make_array(Args&&... args);
17325 <i>Returns:</i> <tt>{std::forward<Args>(args)...}</tt>
17335 <h3><a name="852"></a>852. unordered containers <tt>begin(n)</tt> mistakenly <tt>const</tt></h3>
17336 <p><b>Section:</b> 23.4 [unord] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
17337 <b>Submitter:</b> Robert Klarer <b>Date:</b> 2008-06-12</p>
17338 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unord">active issues</a> in [unord].</p>
17339 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unord">issues</a> in [unord].</p>
17340 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Ready">Ready</a> status.</p>
17341 <p><b>Discussion:</b></p>
17343 In 3 of the four unordered containers the local <tt>begin</tt> member is mistakenly declared <tt>const</tt>:
17346 <blockquote><pre>local_iterator begin(size_type n) const;
17347 </pre></blockquote>
17350 <p><b>Proposed resolution:</b></p>
17352 Change the synopsis in 23.4.1 [unord.map], 23.4.2 [unord.multimap], and 23.4.4 [unord.multiset]:
17355 <blockquote><pre>local_iterator begin(size_type n)<del> const</del>;
17356 </pre></blockquote>
17363 <h3><a name="853"></a>853. <tt>to_string</tt> needs updating with <tt>zero</tt> and <tt>one</tt></h3>
17364 <p><b>Section:</b> 23.3.5 [template.bitset] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17365 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2008-06-18</p>
17366 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#template.bitset">issues</a> in [template.bitset].</p>
17367 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17368 <p><b>Discussion:</b></p>
17370 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#396">396</a> adds defaulted arguments to the <tt>to_string</tt> member, but neglects to update
17371 the three newer <tt>to_string</tt> overloads.
17375 <p><b>Proposed resolution:</b></p>
17377 Change the synopsis in 23.3.5 [template.bitset], and the signatures in 23.3.5.2 [bitset.members] to:
17380 <blockquote><pre>template <class charT, class traits>
17381 basic_string<charT, traits, allocator<charT> > to_string(<ins>charT zero = charT('0'), charT one = charT('1')</ins>) const;
17382 template <class charT>
17383 basic_string<charT, char_traits<charT>, allocator<charT> > to_string(<ins>charT zero = charT('0'), charT one = charT('1')</ins>) const;
17384 basic_string<char, char_traits<char>, allocator<char> > to_string(<ins>char zero = '0', char one = '1'</ins>) const;
17385 </pre></blockquote>
17392 <h3><a name="854"></a>854. <tt>default_delete</tt> converting constructor underspecified</h3>
17393 <p><b>Section:</b> 20.7.11.1.1 [unique.ptr.dltr.dflt] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17394 <b>Submitter:</b> Howard Hinnant <b>Date:</b> 2008-06-18</p>
17395 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17396 <p><b>Discussion:</b></p>
17398 No relationship between <tt>U</tt> and <tt>T</tt> in the converting constructor for <tt>default_delete</tt> template.
17401 Requirements: <tt>U*</tt> is convertible to <tt>T*</tt> and <tt>has_virtual_destructor<T></tt>;
17402 the latter should also become a concept.
17405 Rules out cross-casting.
17408 The requirements for <tt>unique_ptr</tt> conversions should be the same as those on the deleter.
17412 <p><b>Proposed resolution:</b></p>
17414 Change 20.7.11.1.1 [unique.ptr.dltr.dflt]:
17417 <blockquote><pre>namespace std {
17418 template <class T> struct default_delete {
17420 template <class U>
17421 <ins>requires Convertible<U*, T*> && HasVirtualDestructor<T></ins>
17422 default_delete(const default_delete<U>&);
17423 void operator()(T*) const;
17426 </pre></blockquote>
17432 <blockquote><pre>template <class U>
17433 <ins>requires Convertible<U*, T*> && HasVirtualDestructor<T></ins>
17434 default_delete(const default_delete<U>& other);
17435 </pre></blockquote>
17443 <h3><a name="855"></a>855. capacity() and reserve() for deque?</h3>
17444 <p><b>Section:</b> 23.2.2.2 [deque.capacity] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17445 <b>Submitter:</b> Hervé Brönnimann <b>Date:</b> 2008-06-11</p>
17446 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#deque.capacity">active issues</a> in [deque.capacity].</p>
17447 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#deque.capacity">issues</a> in [deque.capacity].</p>
17448 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17449 <p><b>Discussion:</b></p>
17451 The main point is that <tt>capacity</tt> can be viewed as a mechanism to
17452 guarantee the validity of <tt>iterators</tt> when only <tt>push_back/pop_back</tt>
17453 operations are used. For <tt>vector</tt>, this goes with reallocation. For
17454 <tt>deque</tt>, this is a bit more subtle: <tt>capacity()</tt> of a <tt>deque</tt> may shrink,
17455 whereas that of <tt>vector</tt> doesn't. In a circular buffer impl. of the
17456 map, as Howard did, there is very similar notion of capacity: as long
17457 as <tt>size()</tt> is less than <tt>B * (</tt>total size of the map <tt>- 2)</tt>, it is
17458 guaranteed that no <tt>iterator</tt> is invalidated after any number of
17459 <tt>push_front/back</tt> and <tt>pop_front/back</tt> operations. But this does not
17460 hold for other implementations.
17463 Still, I believe, <tt>capacity()</tt> can be defined by <tt>size() +</tt> how many
17464 <tt>push_front/back</tt> minus <tt>pop_front/back</tt> that can be performed before
17465 terators are invalidated. In a classical impl., <tt>capacity() = size()
17466 + </tt> the min distance to either "physical" end of the deque (i.e.,
17467 counting the empty space in the last block plus all the blocks until
17468 the end of the map of block pointers). In Howard's circular buffer
17469 impl., <tt>capacity() = B * (</tt>total size of the map <tt>- 2)</tt> still works with
17470 this definition, even though the guarantee could be made stronger.
17473 A simple picture of a deque:
17475 <blockquote><pre>A-----|----|-----|---F+|++++|++B--|-----|-----Z
17476 </pre></blockquote>
17478 (A,Z mark the beginning/end, | the block boundaries, F=front, B=back,
17479 and - are uninitialized, + are initialized)
17480 In that picture: <tt>capacity = size() + min(dist(A,F),dist(B,Z)) = min
17481 (dist(A,B),dist(F,Z))</tt>.
17484 <tt>Reserve(n)</tt> can grow the map of pointers and add possibly a number of
17485 empty blocks to it, in order to guarantee that the next <tt>n-size()
17486 push_back/push_front</tt> operations will not invalidate iterators, and
17487 also will not allocate (i.e. cannot throw). The second guarantee is
17488 not essential and can be left as a QoI. I know well enough existing
17489 implementations of <tt>deque</tt> (sgi/stl, roguewave, stlport, and
17490 dinkumware) to know that either can be implemented with no change to
17491 the existing class layout and code, and only a few modifications if
17492 blocks are pre-allocated (instead of always allocating a new block,
17493 check if the next entry in the map of block pointers is not zero).
17496 Due to the difference with <tt>vector</tt>, wording is crucial. Here's a
17497 proposed wording to make things concrete; I tried to be reasonably
17498 careful but please double-check me:
17503 <p><b>Proposed resolution:</b></p>
17506 Add new signatures to synopsis in 23.2.2 [deque]:
17509 <blockquote><pre>size_type capacity() const;
17510 bool reserve(size_type n);
17511 </pre></blockquote>
17514 Add new signatures to 23.2.2.2 [deque.capacity]:
17518 <pre>size_type capacity() const;
17522 1 <i>Returns:</i> An upper bound on <tt>n + max(n_f - m_f, n_b - m_b)</tt> such
17523 that, for any sequence of <tt>n_f push_front</tt>, <tt>m_f pop_front</tt>, <tt>n_b
17524 push_back</tt>, and <tt>m_b pop_back</tt> operations, interleaved in any order,
17525 starting with the current <tt>deque</tt> of size <tt>n</tt>, the <tt>deque</tt> does not
17526 invalidate any of its iterators except to the erased elements.
17529 2 <i>Remarks:</i> Unlike a <tt>vector</tt>'s capacity, the capacity of a <tt>deque</tt> can
17530 decrease after a sequence of insertions at both ends, even if none of
17531 the operations caused the <tt>deque</tt> to invalidate any of its iterators
17532 except to the erased elements.
17538 <pre>bool reserve(size_type n);
17542 2 <i>Effects:</i> A directive that informs a <tt>deque</tt> of a planned sequence of
17543 <tt>push_front</tt>, <tt>pop_front</tt>, <tt>push_back</tt>, and <tt>pop_back</tt> operations, so that it
17544 can manage iterator invalidation accordingly. After <tt>reserve()</tt>,
17545 <tt>capacity()</tt> is greater or equal to the argument of <tt>reserve</tt> if this
17546 operation returns <tt>true</tt>; and equal to the previous value of <tt>capacity()</tt>
17547 otherwise. If an exception is thrown, there are no effects.
17550 3 <i>Returns:</i> <tt>true</tt> if iterators are invalidated as a result of this
17551 operation, and false otherwise.
17554 4 <i>Complexity:</i> It does not change the size of the sequence and takes
17555 at most linear time in <tt>n</tt>.
17558 5 <i>Throws:</i> <tt>length_error</tt> if <tt>n > max_size()</tt>.
17561 6 <i>Remarks:</i> It is guaranteed that no invalidation takes place during a
17562 sequence of <tt>insert</tt> or <tt>erase</tt> operations at either end that happens
17563 after a call to <tt>reserve()</tt> except to the erased elements, until the
17564 time when an insertion would make <tt>max(n_f-m_f, n_b-m_b)</tt> larger than
17565 <tt>capacity()</tt>, where <tt>n_f</tt> is the number of <tt>push_front</tt>, <tt>m_f</tt> of <tt>pop_front</tt>,
17566 <tt>n_b</tt> of <tt>push_back</tt>, and <tt>m_b</tt> of <tt>pop_back</tt> operations since the call to
17567 <tt>reserve()</tt>.
17570 7 An implementation is free to pre-allocate buffers so as to
17571 offer the additional guarantee that no exception will be thrown
17572 during such a sequence other than by the element constructors.
17578 And 23.2.2.3 [deque.modifiers] para 1, can be enhanced:
17582 1 <i>Effects:</i> An insertion in the middle of the deque invalidates all the iterators and references to elements of the
17583 deque. An insertion at either end of the deque invalidates all the iterators to the deque,
17584 <ins>unless provisions have been made with reserve,</ins>
17585 but has no effect on the validity of references to elements of the deque.
17593 <h3><a name="856"></a>856. Removal of <tt>aligned_union</tt></h3>
17594 <p><b>Section:</b> 20.5.7 [meta.trans.other] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17595 <b>Submitter:</b> Jens Maurer <b>Date:</b> 2008-06-12</p>
17596 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#meta.trans.other">active issues</a> in [meta.trans.other].</p>
17597 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#meta.trans.other">issues</a> in [meta.trans.other].</p>
17598 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17599 <p><b>Discussion:</b></p>
17601 With the arrival of extended unions
17602 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf">N2544</a>),
17604 known use of <tt>aligned_union</tt> that couldn't be handled by
17605 the "extended unions" core-language facility.
17609 <p><b>Proposed resolution:</b></p>
17611 Remove the following signature from 20.5.2 [meta.type.synop]:
17613 <blockquote><pre>template <std::size_t Len, class... Types> struct aligned_union;
17614 </pre></blockquote>
17617 Remove the second row from table 51 in 20.5.7 [meta.trans.other],
17621 <blockquote><pre>template <std::size_t Len,
17623 struct aligned_union;
17624 </pre></blockquote>
17631 <h3><a name="857"></a>857. <tt>condition_variable::time_wait</tt> return <tt>bool</tt> error prone</h3>
17632 <p><b>Section:</b> 30.4.1 [thread.condition.condvar] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17633 <b>Submitter:</b> Beman Dawes <b>Date:</b> 2008-06-13</p>
17634 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17635 <p><b>Discussion:</b></p>
17637 The meaning of the <tt>bool</tt> returned by <tt>condition_variable::timed_wait</tt> is so
17638 obscure that even the class' designer can't deduce it correctly. Several
17639 people have independently stumbled on this issue.
17642 It might be simpler to change the return type to a scoped enum:
17644 <blockquote><pre>enum class timeout { not_reached, reached };
17645 </pre></blockquote>
17648 That's the same cost as returning a <tt>bool</tt>, but not subject to mistakes. Your example below would be:
17651 <blockquote><pre>if (cv.wait_until(lk, time_limit) == timeout::reached )
17653 </pre></blockquote>
17656 Beman to supply exact wording.
17661 <p><b>Proposed resolution:</b></p>
17668 <h3><a name="858"></a>858. Wording for Minimal Support for Garbage Collection</h3>
17669 <p><b>Section:</b> X [garbage.collection] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17670 <b>Submitter:</b> Pete Becker <b>Date:</b> 2008-06-21</p>
17671 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17672 <p><b>Discussion:</b></p>
17674 The first sentence of the Effects clause for <tt>undeclare_reachable</tt> seems
17675 to be missing some words. I can't parse
17678 ... for all non-null <tt>p</tt> referencing the argument is no longer declared reachable...
17681 I take it the intent is that <tt>undeclare_reachable</tt> should be called only
17682 when there has been a corresponding call to <tt>declare_reachable</tt>. In
17683 particular, although the wording seems to allow it, I assume that code
17684 shouldn't call <tt>declare_reachable</tt> once then call <tt>undeclare_reachable</tt>
17688 I don't know what "shall be live" in the Requires clause means.
17691 In the final Note for <tt>undeclare_reachable</tt>, what does "cannot be
17692 deallocated" mean? Is this different from "will not be able to collect"?
17696 For the wording on nesting of <tt>declare_reachable</tt> and
17697 <tt>undeclare_reachable</tt>, the words for locking and unlocking recursive
17698 mutexes probably are a good model.
17702 <p><b>Proposed resolution:</b></p>
17711 <h3><a name="859"></a>859. Monotonic Clock is Conditionally Supported?</h3>
17712 <p><b>Section:</b> X [datetime] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17713 <b>Submitter:</b> Pete Becker <b>Date:</b> 2008-06-23</p>
17714 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17715 <p><b>Discussion:</b></p>
17717 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.html">N2661</a>
17718 says that there is a class named <tt>monotonic_clock</tt>. It also says that this
17719 name may be a synonym for <tt>system_clock</tt>, and that it's conditionally
17720 supported. So the actual requirement is that it can be monotonic or not,
17721 and you can tell by looking at <tt>is_monotonic</tt>, or it might not exist at
17722 all (since it's conditionally supported). Okay, maybe too much
17723 flexibility, but so be it.
17726 A problem comes up in the threading specification, where several
17727 variants of <tt>wait_for</tt> explicitly use <tt>monotonic_clock::now()</tt>. What is the
17728 meaning of an effects clause that says
17731 <blockquote><pre>wait_until(lock, chrono::monotonic_clock::now() + rel_time)
17732 </pre></blockquote>
17735 when <tt>monotonic_clock</tt> is not required to exist?
17739 <p><b>Proposed resolution:</b></p>
17748 <h3><a name="860"></a>860. Floating-Point State</h3>
17749 <p><b>Section:</b> 26 [numerics] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17750 <b>Submitter:</b> Lawrence Crowl <b>Date:</b> 2008-06-23</p>
17751 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17752 <p><b>Discussion:</b></p>
17754 There are a number of functions that affect the floating point state.
17755 These function need to be thread-safe, but I'm unsure of the right
17756 approach in the standard, as we inherit them from C.
17760 <p><b>Proposed resolution:</b></p>
17769 <h3><a name="861"></a>861. Incomplete specification of EqualityComparable for std::forward_list</h3>
17770 <p><b>Section:</b> 23.1 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17771 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-06-24</p>
17772 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements">active issues</a> in [container.requirements].</p>
17773 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements">issues</a> in [container.requirements].</p>
17774 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17775 <p><b>Discussion:</b></p>
17777 Table 89, Container requirements, defines <tt>operator==</tt> in terms of the container
17778 member function <tt>size()</tt> and the algorithm <tt>std::equal</tt>:
17782 <tt>==</tt> is an equivalence relation. <tt>a.size() == b.size() &&
17783 equal(a.begin(), a.end(), b.begin()</tt>
17787 The new container <tt>forward_list</tt> does not provide a <tt>size</tt> member function
17788 by design but does provide <tt>operator==</tt> and <tt>operator!=</tt> without specifying it's semantic.
17791 Other parts of the (sequence) container requirements do also depend on
17792 <tt>size()</tt>, e.g. <tt>empty()</tt>
17793 or <tt>clear()</tt>, but this issue explicitly attempts to solve the missing
17794 <tt>EqualityComparable</tt> specification,
17795 because of the special design choices of <tt>forward_list</tt>.
17798 I propose to apply one of the following resolutions, which are described as:
17803 Provide a definition, which is optimal for this special container without
17804 previous size test. This choice prevents two <tt>O(N)</tt> calls of <tt>std::distance()</tt>
17805 with the corresponding container ranges and instead uses a special
17806 <tt>equals</tt> implementation which takes two container ranges instead of 1 1/2.
17809 The simple fix where the usual test is adapted such that <tt>size()</tt> is replaced
17810 by <tt>distance</tt> with corresponding performance disadvantages.
17814 Both proposal choices are discussed, the preferred choice of the author is
17819 <p><b>Proposed resolution:</b></p>
17826 Just betwen 23.2.3.5 [forwardlist.ops] and 23.2.3.6 [forwardlist.spec]
17828 section "forwardlist comparison operators" [forwardlist.compare] (and
17830 new section number to 23.2.3 [forwardlist]/2 in front of "Comparison operators"):
17833 forwardlist comparison operators [forwardlist.compare]
17845 Add to the new section [forwardlist.compare] the following paragraphs:
17849 <pre>template <class T, class Allocator>
17850 bool operator==(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
17854 <i>Requires:</i> Type <tt>T</tt> is <tt>EqualityComparable</tt> ([equalitycomparable]).
17857 <i>Returns:</i> <tt>true</tt> if
17862 for every iterator <tt>i</tt> in the range <tt>[x.begin(), E)</tt>, where <tt>E ==
17863 x.begin() + M</tt> and <tt>M ==
17864 min(distance(x.begin(), x.end()), distance(y.begin(), y.end()))</tt>,
17865 the following condition holds:
17867 <blockquote><pre>*i == *(y.begin() + (i - x.begin())).
17868 </pre></blockquote>
17871 if <tt>i == E</tt> then <tt>i == x.end() && (y.begin() + (i - x.begin())) == y.end()</tt>.
17874 Otherwise, returns <tt>false</tt>.
17878 <i>Throws:</i> Nothing unless an exception is thrown by the equality comparison.
17881 <i>Complexity:</i> At most <tt>M</tt> comparisons.
17884 <pre>template <class T, class Allocator>
17885 bool operator!=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
17888 <i>Returns:</i> <tt>!(x == y)</tt>.
17902 Add to the new section [forwardlist.compare] the following paragraphs:
17905 <pre>template <class T, class Allocator>
17906 bool operator==(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
17910 <i>Requires:</i> Type <tt>T</tt> is <tt>EqualityComparable</tt> ([equalitycomparable]).
17913 <i>Returns:</i> <tt>distance(x.begin(), x.end()) == distance(y.begin(), y.end())
17914 && equal(x.begin(), x.end(), y.begin())</tt>.
17917 <pre>template <class T, class Allocator>
17918 bool operator!=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
17921 <i>Returns:</i> <tt>!(x == y)</tt>.
17933 <h3><a name="862"></a>862. Impossible complexity for 'includes'</h3>
17934 <p><b>Section:</b> 25.3.5.1 [includes] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17935 <b>Submitter:</b> Alisdair Meredith <b>Date:</b> 2008-07-02</p>
17936 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17937 <p><b>Discussion:</b></p>
17939 In 25.3.5.1 [includes] the complexity is "at most -1 comparisons" if passed
17940 two empty ranges. I don't know how to perform a negative number of
17945 This same issue also applies to:
17949 <li><tt>set_union</tt></li>
17950 <li><tt>set_intersection</tt></li>
17951 <li><tt>set_difference</tt></li>
17952 <li><tt>set_symmetric_difference</tt></li>
17953 <li><tt>merge</tt></li>
17957 <p><b>Proposed resolution:</b></p>
17966 <h3><a name="863"></a>863. What is the state of a stream after close() succeeds</h3>
17967 <p><b>Section:</b> 27.8.1 [fstreams] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17968 <b>Submitter:</b> Steve Clamage <b>Date:</b> 2008-07-08</p>
17969 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#fstreams">issues</a> in [fstreams].</p>
17970 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
17971 <p><b>Discussion:</b></p>
17973 Suppose writing to an <tt>[o]fstream</tt> fails and you later close the <tt>stream</tt>.
17974 The <tt>overflow()</tt> function is called to flush the buffer (if it exists).
17975 Then the file is unconditionally closed, as if by calling <tt>flcose</tt>.
17978 If either <tt>overflow</tt> or <tt>fclose</tt> fails, <tt>close()</tt> reports failure, and clearly
17979 the <tt>stream</tt> should be in a failed or bad state.
17982 Suppose the buffer is empty or non-existent (so that <tt>overflow()</tt> does not
17983 fail), and <tt>fclose</tt> succeeds. The <tt>close()</tt> function reports success, but
17984 what is the state of the <tt>stream</tt>?
17988 <p><b>Proposed resolution:</b></p>
17997 <h3><a name="864"></a>864. Defect in atomic wording</h3>
17998 <p><b>Section:</b> 29.4 [atomics.types.operations] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
17999 <b>Submitter:</b> Anthony Williams <b>Date:</b> 2008-07-10</p>
18000 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics.types.operations">issues</a> in [atomics.types.operations].</p>
18001 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18002 <p><b>Discussion:</b></p>
18004 There's an error in 29.4 [atomics.types.operations]/p9:
18008 <pre>C atomic_load(const volatile A * object);
18009 C atomic_load_explicit(const volatile A * object, memory_order);
18010 C A ::load(memory_order order = memory_order_seq_cst) const volatile;
18014 <i>Requires:</i> The <tt>order</tt> argument shall not be <tt>memory_order_acquire</tt> nor
18015 <tt>memory_order_acq_rel</tt>.
18021 I believe that this should state
18024 shall not be <tt>memory_order_release</tt>.
18028 There's also an error in 29.4 [atomics.types.operations]/p17:
18032 ... When only one <tt>memory_order</tt> argument is supplied, the value of success
18033 is <tt>order</tt>, and
18034 the value of failure is <tt>order</tt> except that a value of
18035 <tt>memory_order_acq_rel</tt> shall be replaced by the value
18036 <tt>memory_order_require</tt> ...
18039 I believe this should state
18042 shall be replaced by the value <tt>memory_order_acquire</tt> ...
18046 <p><b>Proposed resolution:</b></p>
18048 Change 29.4 [atomics.types.operations]/p9:
18052 <pre>C atomic_load(const volatile A * object);
18053 C atomic_load_explicit(const volatile A * object, memory_order);
18054 C A ::load(memory_order order = memory_order_seq_cst) const volatile;
18058 <i>Requires:</i> The <tt>order</tt> argument shall not be <del><tt>memory_order_acquire</tt></del>
18059 <ins><tt>memory_order_release</tt></ins> nor <tt>memory_order_acq_rel</tt>.
18065 Change 29.4 [atomics.types.operations]/p17:
18069 ... When only one <tt>memory_order</tt> argument is supplied, the value of success
18070 is <tt>order</tt>, and
18071 the value of failure is <tt>order</tt> except that a value of
18072 <tt>memory_order_acq_rel</tt> shall be replaced by the value
18073 <del><tt>memory_order_require</tt></del> <ins><tt>memory_order_acquire</tt></ins> ...
18082 <h3><a name="865"></a>865. More algorithms that throw away information</h3>
18083 <p><b>Section:</b> 25.2.6 [alg.fill], 25.2.7 [alg.generate] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18084 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-07-13</p>
18085 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18086 <p><b>Discussion:</b></p>
18088 In regard to library defect <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#488">488</a> I found some more algorithms which
18089 unnecessarily throw away information. These are typically algorithms,
18090 which sequentially write into an <tt>OutputIterator</tt>, but do not return the
18091 final value of this output iterator. These cases are:
18096 <pre>template<class OutputIterator, class Size, class T>
18097 void fill_n(OutputIterator first, Size n, const T& value);</pre></li>
18100 <pre>template<class OutputIterator, class Size, class Generator>
18101 void generate_n(OutputIterator first, Size n, Generator gen);</pre></li>
18104 In both cases the minimum requirements on the iterator are
18105 <tt>OutputIterator</tt>, which means according to the requirements of
18106 24.1.2 [output.iterators]/2 that only single-pass iterations are guaranteed.
18107 So, if users of <tt>fill_n</tt> and <tt>generate_n</tt> have *only* an <tt>OutputIterator</tt>
18108 available, they have no chance to continue pushing further values
18109 into it, which seems to be a severe limitation to me.
18113 <p><b>Proposed resolution:</b></p>
18117 Replace the current declaration of <tt>fill_n</tt> in 25 [algorithms]/2, header
18118 <tt><algorithm></tt> synopsis and in 25.2.6 [alg.fill] by
18121 <blockquote><pre>template<class OutputIterator, class Size, class T>
18122 <del>void</del> <ins>OutputIterator</ins> fill_n(OutputIterator first, Size n, const T& value);
18123 </pre></blockquote>
18125 Just after the effects clause p.2 add a new returns clause saying:
18128 <i>Returns:</i> <tt>first + n</tt> for <tt>fill_n</tt>.
18133 Replace the current declaration of <tt>generate_n</tt> in 25 [algorithms]/2, header
18134 <tt><algorithm></tt> synopsis and in 25.2.7 [alg.generate] by
18136 <blockquote><pre>template<class OutputIterator, class Size, class Generator>
18137 <del>void</del> <ins>OutputIterator</ins> generate_n(OutputIterator first, Size n, Generator gen);
18138 </pre></blockquote>
18140 Just after the effects clause p.1 add a new returns clause saying:
18143 <i>Returns:</i> <tt>first + n</tt> for <tt>generate_n</tt>.
18153 <h3><a name="866"></a>866. Qualification of placement new-expressions</h3>
18154 <p><b>Section:</b> 20.7.10 [specialized.algorithms], 20.7.12.2.6 [util.smartptr.shared.create] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18155 <b>Submitter:</b> Alberto Ganesh Barbati <b>Date:</b> 2008-07-14</p>
18156 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18157 <p><b>Discussion:</b></p>
18159 LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#402">402</a> replaced "<tt>new</tt>" with "<tt>::new</tt>" in the placement
18160 new-expression in 20.7.5.1 [allocator.members]. I believe the rationale
18161 given in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#402">402</a> applies also to the following other contexts:
18166 in 20.7.10 [specialized.algorithms], all four algorithms <tt>unitialized_copy</tt>,
18167 <tt>unitialized_copy_n</tt>, <tt>unitialized_fill</tt> and <tt>unitialized_fill_n</tt> use
18168 the unqualified placement new-expression in some variation of the form:
18170 <blockquote><pre>new (static_cast<void*>(&*result)) typename iterator_traits<ForwardIterator>::value_type(*first);
18171 </pre></blockquote>
18175 in 20.7.12.2.6 [util.smartptr.shared.create] there is a reference to the unqualified placement new-expression:
18177 <blockquote><pre>new (pv) T(std::forward<Args>(args)...),
18178 </pre></blockquote>
18182 I suggest to add qualification in all those places. As far as I know,
18183 these are all the remaining places in the whole library that explicitly
18184 use a placement new-expression. Should other uses come out, they should
18185 be qualified as well.
18188 As an aside, a qualified placement new-expression does not need
18189 additional requirements to be compiled in a constrained context. By
18190 adding qualification, the <tt>HasPlacementNew</tt> concept introduced recently in
18191 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2677.pdf">N2677 (Foundational Concepts)</a>
18192 would no longer be needed by library and
18193 should therefore be removed.
18197 <p><b>Proposed resolution:</b></p>
18199 Replace "<tt>new</tt>" with "<tt>::new</tt>" in:
18203 20.7.10.1 [uninitialized.copy], paragraphs 1 and 3
18206 20.7.10.2 [uninitialized.fill] paragraph 1
18209 20.7.10.3 [uninitialized.fill.n] paragraph 1
18212 20.7.12.2.6 [util.smartptr.shared.create] once in paragraph 1 and twice in paragraph 2.
18222 <h3><a name="867"></a>867. Valarray and value-initialization</h3>
18223 <p><b>Section:</b> 26.5.2.1 [valarray.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18224 <b>Submitter:</b> Alberto Ganesh Barbati <b>Date:</b> 2008-07-20</p>
18225 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#valarray.cons">active issues</a> in [valarray.cons].</p>
18226 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#valarray.cons">issues</a> in [valarray.cons].</p>
18227 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18228 <p><b>Discussion:</b></p>
18230 From 26.5.2.1 [valarray.cons], paragraph 2:
18233 <blockquote><pre>explicit valarray(size_t);
18236 The array created by this constructor has a length equal to the value of the argument. The elements
18237 of the array are constructed using the default constructor for the instantiating type <tt>T</tt>.
18242 The problem is that the most obvious <tt>T</tt>s for <tt>valarray</tt> are <tt>float</tt>
18243 and <tt>double</tt>, they don't have a default constructor. I guess the intent is to value-initialize
18244 the elements, so I suggest replacing:
18248 The elements of the array are constructed using the default constructor for the instantiating type <tt>T</tt>.
18254 The elements of the array are value-initialized.
18258 There is another reference to the default constructor of <tt>T</tt> in the non-normative note in paragraph 9.
18259 That reference should also be replaced. (The normative wording in paragraph 8 refers to <tt>T()</tt>
18260 and so it doesn't need changes).
18264 <p><b>Proposed resolution:</b></p>
18266 Change 26.5.2.1 [valarray.cons], paragraph 2:
18270 <pre>explicit valarray(size_t);
18273 The array created by this constructor has a length equal to the value of the argument. The elements
18274 of the array are <del>constructed using the default constructor for the instantiating type <tt>T</tt></del>
18275 <ins>value-initialized (8.5 [dcl.init])</ins>.
18280 Change 26.5.2.7 [valarray.members], paragraph 9:
18284 [<i>Example:</i> If the argument has the value -2, the first two elements of the result will be <del>constructed using the
18285 default constructor</del>
18286 <ins>value-initialized (8.5 [dcl.init])</ins>;
18287 the third element of the result will be assigned the value of the first element of the argument; etc. <i>-- end example</i>]
18296 <h3><a name="868"></a>868. default construction and value-initialization</h3>
18297 <p><b>Section:</b> 23 [containers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18298 <b>Submitter:</b> Alberto Ganesh Barbati <b>Date:</b> 2008-07-22</p>
18299 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#containers">active issues</a> in [containers].</p>
18300 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#containers">issues</a> in [containers].</p>
18301 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18302 <p><b>Discussion:</b></p>
18304 The term "default constructed" is often used in wording that predates
18305 the introduction of the concept of value-initialization. In a few such
18306 places the concept of value-initialization is more correct than the
18307 current wording (for example when the type involved can be a built-in)
18308 so a replacement is in order. Two of such places are already covered by
18309 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#867">867</a>. This issue deliberately addresses the hopefully
18310 non-controversial changes in the attempt of being approved more quickly.
18311 A few other occurrences (for example in <tt>std::tuple</tt>,
18312 <tt>std::reverse_iterator</tt> and <tt>std::move_iterator</tt>) are left to separate
18313 issues. For <tt>std::reverse_iterator</tt>, see also issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#408">408</a>. This issue is
18314 related with issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#724">724</a>.
18318 <p><b>Proposed resolution:</b></p>
18320 Change 20.1.1 [utility.arg.requirements], paragraph 2:
18324 In general, a default constructor is not required. Certain container class member function signatures specify
18325 <del>the default constructor</del>
18326 <ins><tt>T()</tt></ins>
18327 as a default argument. <tt>T()</tt> shall be a well-defined expression (8.5 [dcl.init]) if one of
18328 those signatures is called using the default argument (8.3.6 [dcl.fct.default]).
18332 In all the following paragraphs in clause 23 [containers], replace "default constructed" with "value-initialized
18337 <li>23.2.2.1 [deque.cons] para 2</li>
18338 <li>23.2.2.2 [deque.capacity] para 1</li>
18339 <li>23.2.3.1 [forwardlist.cons] para 3</li>
18340 <li>23.2.3.4 [forwardlist.modifiers] para 21</li>
18341 <li>23.2.4.1 [list.cons] para 3</li>
18342 <li>23.2.4.2 [list.capacity] para 1</li>
18343 <li>23.2.6.1 [vector.cons] para 3</li>
18344 <li>23.2.6.2 [vector.capacity] para 10</li>
18352 <h3><a name="869"></a>869. Bucket (local) iterators and iterating past end</h3>
18353 <p><b>Section:</b> 23.1.5 [unord.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18354 <b>Submitter:</b> Sohail Somani <b>Date:</b> 2008-07-22</p>
18355 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unord.req">active issues</a> in [unord.req].</p>
18356 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unord.req">issues</a> in [unord.req].</p>
18357 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18358 <p><b>Discussion:</b></p>
18360 Is there any language in the current draft specifying the behaviour of the following snippet?
18363 <blockquote><pre>unordered_set<int> s;
18364 unordered_set<int>::local_iterator it = s.end(0);
18366 // Iterate past end - the unspecified part
18368 </pre></blockquote>
18371 I don't think there is anything about <tt>s.end(n)</tt> being considered an
18372 iterator for the past-the-end value though (I think) it should be.
18376 <p><b>Proposed resolution:</b></p>
18378 Change Table 97 "Unordered associative container requirements" in 23.1.5 [unord.req]:
18383 <caption>Table 97: Unordered associative container requirements</caption>
18385 <th>expression</th><th>return type</th><th>assertion/note pre/post-condition</th><th>complexity</th>
18388 <td><tt>b.begin(n)</tt></td>
18389 <td><tt>local_iterator</tt><br><tt>const_local_iterator</tt> for const <tt>b</tt>.</td>
18390 <td>Pre: n shall be in the range [0,b.bucket_count()). <del>Note: [b.begin(n), b.end(n)) is a
18391 valid range containing all of the elements in the n<sup>th</sup> bucket.</del>
18392 <ins><tt>b.begin(n)</tt> returns an iterator referring to the first element in the bucket.
18393 If the bucket is empty, then <tt>b.begin(n) == b.end(n)</tt>.</ins></td>
18397 <td><tt>b.end(n)</tt></td>
18398 <td><tt>local_iterator</tt><br><tt>const_local_iterator</tt> for const <tt>b</tt>.</td>
18399 <td>Pre: n shall be in the range <tt>[0, b.bucket_count())</tt>.
18400 <ins><tt>b.end(n)</tt> returns an iterator which is the past-the-end value for the bucket.</ins></td>
18412 <h3><a name="870"></a>870. Do unordered containers not support function pointers for predicate/hasher?</h3>
18413 <p><b>Section:</b> 23.1.5 [unord.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18414 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-08-17</p>
18415 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unord.req">active issues</a> in [unord.req].</p>
18416 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unord.req">issues</a> in [unord.req].</p>
18417 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18418 <p><b>Discussion:</b></p>
18420 Good ol' associative containers allow both function pointers and
18421 function objects as feasible
18422 comparators, as described in 23.1.4 [associative.reqmts]/2:
18426 Each associative container is parameterized on <tt>Key</tt> and an ordering
18427 relation <tt>Compare</tt> that
18428 induces a strict weak ordering (25.3) on elements of Key. [..]. The
18429 object of type <tt>Compare</tt> is
18430 called the comparison object of a container. This comparison object
18431 may be a pointer to
18432 function or an object of a type with an appropriate function call operator.[..]
18436 The corresponding wording for unordered containers is not so clear,
18437 but I read it to disallow
18438 function pointers for the hasher and I miss a clear statement for the
18439 equality predicate, see
18440 23.1.5 [unord.req]/3+4+5:
18445 Each unordered associative container is parameterized by <tt>Key</tt>, by a
18446 function object <tt>Hash</tt> that
18447 acts as a hash function for values of type <tt>Key</tt>, and by a binary
18448 predicate <tt>Pred</tt> that induces an
18449 equivalence relation on values of type <tt>Key</tt>.[..]
18452 A hash function is a function object that takes a single argument of
18453 type <tt>Key</tt> and returns a
18454 value of type <tt>std::size_t</tt>.
18457 Two values <tt>k1</tt> and <tt>k2</tt> of type <tt>Key</tt> are considered equal if the
18458 container's equality function object
18459 returns <tt>true</tt> when passed those values.[..]
18464 and table 97 says in the column "assertion...post-condition" for the
18465 expression X::hasher:
18469 <tt>Hash</tt> shall be a unary function object type such that the expression
18470 <tt>hf(k)</tt> has type <tt>std::size_t</tt>.
18474 Note that 20.6 [function.objects]/1 defines as "Function objects are
18475 objects with an <tt>operator()</tt> defined.[..]"
18478 Does this restriction exist by design or is it an oversight? If an
18479 oversight, I suggest that to apply
18484 <p><b>Proposed resolution:</b></p>
18486 In 23.1.5 [unord.req]/3, just after the second sentence which is written as
18490 Additionally, <tt>unordered_map</tt> and <tt>unordered_multimap</tt> associate an
18491 arbitrary mapped type <tt>T</tt> with the <tt>Key</tt>.
18495 add one further sentence:
18499 Both <tt>Hash</tt> and <tt>Pred</tt> may be pointers to function or objects of a type
18500 with an appropriate function call operator.
18504 [Note1: Since the detailed requirements for <tt>Pred</tt> and <tt>Hash</tt> are given in
18505 p.4 and p.5, it an alternative resolution
18506 would be to insert a new paragraph just after p.5, which contains the
18507 above proposed sentence]
18510 [Note2: I do not propose a change of above quoted element in table 97,
18511 because the mis-usage of the
18512 notion of "function object" seems already present in the standard at
18513 several places, even if it includes
18514 function pointers, see e.g. 25 [algorithms]/7. The important point is
18515 that in those places a statement is
18516 given that the actually used symbol, like "Predicate" applies for
18517 function pointers as well]
18525 <h3><a name="871"></a>871. Iota's requirements on T are too strong</h3>
18526 <p><b>Section:</b> 26.6.5 [numeric.iota] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18527 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-08-20</p>
18528 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18529 <p><b>Discussion:</b></p>
18531 According to the recent WP
18532 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2691.pdf">N2691</a>,
18533 26.6.5 [numeric.iota]/1, the requires clause
18534 of <tt>std::iota</tt> says:
18538 <tt>T</tt> shall meet the requirements of <tt>CopyConstructible</tt> and <tt>Assignable</tt> types, and
18539 shall be convertible to <tt>ForwardIterator</tt>'s value type.[..]
18543 Neither <tt>CopyConstructible</tt> nor <tt>Assignable</tt> is needed, instead <tt>MoveConstructible</tt>
18544 seems to be the correct choice. I guess the current wording resulted as an
18545 artifact from comparing it with similar numerical algorithms like <tt>accumulate</tt>.
18549 Note: If this function will be conceptualized, the here proposed
18550 <tt>MoveConstructible</tt>
18551 requirement can be removed, because this is an implied requirement of
18552 function arguments, see
18553 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2710.pdf">N2710</a>/[temp.req.impl]/3, last bullet.
18558 <p><b>Proposed resolution:</b></p>
18561 Change the first sentence of 26.6.5 [numeric.iota]/1:
18565 <i>Requires:</i> <tt>T</tt> shall <del>meet the requirements of
18566 <tt>CopyConstructible</tt> and <tt>Assignable</tt> types,</del>
18568 be <tt>MoveConstructible</tt> (Table 34)
18571 convertible to <tt>ForwardIterator</tt>'s value type. [..]
18580 <h3><a name="872"></a>872. <tt>move_iterator::operator[]</tt> has wrong return type</h3>
18581 <p><b>Section:</b> 24.4.3.3.12 [move.iter.op.index] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18582 <b>Submitter:</b> Doug Gregor <b>Date:</b> 2008-08-21</p>
18583 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18584 <p><b>Discussion:</b></p>
18586 <tt>move_iterator</tt>'s <tt>operator[]</tt> is declared as:
18589 <blockquote><pre>reference operator[](difference_type n) const;
18590 </pre></blockquote>
18593 This has the same problem that <tt>reverse_iterator</tt>'s <tt>operator[]</tt> used to
18594 have: if the underlying iterator's <tt>operator[]</tt> returns a proxy, the
18595 implicit conversion to <tt>value_type&&</tt> could end up referencing a temporary
18596 that has already been destroyed. This is essentially the same issue that
18597 we dealt with for <tt>reverse_iterator</tt> in DR <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#386">386</a>.
18601 <p><b>Proposed resolution:</b></p>
18603 In 24.4.3.1 [move.iterator] and 24.4.3.3.12 [move.iter.op.index], change the declaration of
18604 <tt>move_iterator</tt>'s <tt>operator[]</tt> to:
18607 <blockquote><pre><del>reference</del> <ins><i>unspecified</i></ins> operator[](difference_type n) const;
18608 </pre></blockquote>
18616 <h3><a name="873"></a>873. signed integral type and unsigned integral type are not clearly defined</h3>
18617 <p><b>Section:</b> 3.9.1 [basic.fundamental] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
18618 <b>Submitter:</b> Travis Vitek <b>Date:</b> 2008-06-30</p>
18619 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
18620 <p><b>Discussion:</b></p>
18622 Neither the term "signed integral type" nor the term "unsigned
18623 integral type" is defined in the core language section of the
18624 standard, therefore the library section should avoid its use. The
18625 terms <i>signed integer type</i> and <i>unsigned integer type</i> are
18626 indeed defined (in 3.9.1 [basic.fundamental]), thus the usages should be
18627 replaced accordingly.
18631 Note that the key issue here is that "signed" + "integral type" !=
18632 "signed integral type".
18634 The types <code>bool</code>, <code>char</code>, <code>char16_t</code>,
18635 <code>char32_t</code> and <code>wchar_t</code> are all listed as
18636 integral types, but are neither of <i>signed integer type</i> or
18637 <i>unsigned integer type</i>. According to 3.9 [basic.types] p7, a synonym for
18638 integral type is <i>integer type</i>.
18640 Given this, one may choose to assume that an <i>integral type</i> that
18641 can represent values less than zero is a <i>signed integral type</i>.
18642 Unfortunately this can cause ambiguities.
18644 As an example, if <code>T</code> is <code>unsigned char</code>, the
18645 expression <code>make_signed<T>::type</code>, is supposed to
18646 name a signed integral type. There are potentially two types that
18647 satisfy this requirement, namely <code>signed char</code> and
18648 <code>char</code> (assuming <code>CHAR_MIN < 0</code>).
18652 <p><b>Proposed resolution:</b></p>
18654 I propose to use the terms "signed integer type" and "unsigned integer
18655 type" in place of "signed integral type" and "unsigned integral type"
18656 to eliminate such ambiguities.
18660 The proposed change makes it absolutely clear that the difference
18661 between two pointers cannot be <tt>char</tt> or <tt>wchar_t</tt>,
18662 but could be any of the signed integer types.
18663 5.7 [expr.add] paragraph 6...
18669 When two pointers to elements of the same array object are
18670 subtracted, the result is the difference of the subscripts of
18671 the two array elements. The type of the result is an
18672 implementation-defined <del>signed integral
18673 type</del><ins>signed integer type</ins>; this type shall be the
18674 same type that is defined as <code>std::ptrdiff_t</code> in the
18675 <code><cstdint></code> header (18.1)...
18682 The proposed change makes it clear that <tt>X::size_type</tt> and
18683 <tt>X::difference_type</tt> cannot be <tt>char</tt> or
18684 <tt>wchar_t</tt>, but could be one of the signed or unsigned integer
18685 types as appropriate.
18686 20.1.2 [allocator.requirements] table 40...
18689 Table 40: Allocator requirements
18693 <th>expression</th>
18694 <th>return type</th>
18695 <th>assertion/note/pre/post-condition</th>
18700 <td><tt>X::size_type</tt></td>
18702 <del>unsigned integral type</del>
18703 <ins>unsigned integer type</ins>
18705 <td>a type that can represent the size of the largest object in
18706 the allocation model.</td>
18709 <td><tt>X::difference_type</tt></td>
18711 <del>signed integral type</del>
18712 <ins>signed integer type</ins>
18714 <td>a type that can represent the difference between any two
18715 pointers in the allocation model.</td>
18722 The proposed change makes it clear that <tt>make_signed<T>::type</tt>
18723 must be one of the signed integer types as defined in 3.9.1. Ditto for
18724 <tt>make_unsigned<T>type</tt> and unsigned integer types.
18725 20.5.6.3 [meta.trans.sign] table 48...
18728 Table 48: Sign modifications
18739 <tt>template <class T> struct make_signed;</tt>
18742 If <code>T</code> names a (possibly cv-qualified) <del>signed
18743 integral type</del><ins>signed integer type</ins> (3.9.1) then
18744 the member typedef <code>type</code> shall name the type
18745 <code>T</code>; otherwise, if <code>T</code> names a (possibly
18746 cv-qualified) <del>unsigned integral type</del><ins>unsigned
18747 integer type</ins> then <code>type</code> shall name the
18748 corresponding <del>signed integral type</del><ins>signed
18749 integer type</ins>, with the same cv-qualifiers as
18750 <code>T</code>; otherwise, <code>type</code> shall name the
18751 <del>signed integral type</del><ins>signed integer type</ins>
18752 with the smallest rank (4.13) for which <code>sizeof(T) ==
18753 sizeof(type)</code>, with the same cv-qualifiers as
18756 <i>Requires:</i> <code>T</code> shall be a (possibly
18757 cv-qualified) integral type or enumeration but not a
18758 <code>bool</code> type.
18763 <tt>template <class T> struct make_unsigned;</tt>
18766 If <code>T</code> names a (possibly cv-qualified)
18767 <del>unsigned integral type</del><ins>unsigned integer
18768 type</ins> (3.9.1) then the member typedef <code>type</code>
18769 shall name the type <code>T</code>; otherwise, if
18770 <code>T</code> names a (possibly cv-qualified) <del>signed
18771 integral type</del><ins>signed integer type</ins> then
18772 <code>type</code> shall name the corresponding <del>unsigned
18773 integral type</del><ins>unsigned integer type</ins>, with the
18774 same cv-qualifiers as <code>T</code>; otherwise,
18775 <code>type</code> shall name the <del>unsigned integral
18776 type</del><ins>unsigned integer type</ins> with the smallest
18777 rank (4.13) for which <code>sizeof(T) == sizeof(type)</code>,
18778 with the same cv-qualifiers as <code>T</code>.
18780 <i>Requires:</i> <code>T</code> shall be a (possibly
18781 cv-qualified) integral type or enumeration but not a
18782 <code>bool</code> type.
18791 Note: I believe that the basefield values should probably be
18792 prefixed with <tt>ios_base::</tt> as they are in 22.2.2.2.2 [facet.num.put.virtuals]
18794 The listed virtuals are all overloaded on signed and unsigned integer
18795 types, the new wording just maintains consistency.
18797 22.2.2.1.2 [facet.num.get.virtuals] table 78...
18800 Table 78: Integer Conversions
18805 <th><tt>stdio</tt> equivalent</th>
18810 <td><tt>basefield == oct</tt></td>
18811 <td><tt>%o</tt></td>
18814 <td><tt>basefield == hex</tt></td>
18815 <td><tt>%X</tt></td>
18818 <td><tt>basefield == 0</tt></td>
18819 <td><tt>%i</tt></td>
18822 <td><del>signed integral type</del><ins>signed integer
18824 <td><tt>%d</tt></td>
18827 <td><del>unsigned integral type</del><ins>unsigned integer
18829 <td><tt>%u</tt></td>
18838 Rationale is same as above.
18839 22.2.2.2.2 [facet.num.put.virtuals] table 80...
18842 Table 80: Integer Conversions
18847 <th><tt>stdio</tt> equivalent</th>
18852 <td><tt>basefield == ios_base::oct</tt></td>
18853 <td><tt>%o</tt></td>
18856 <td><tt>(basefield == ios_base::hex) &&
18857 !uppercase</tt></td>
18858 <td><tt>%x</tt></td>
18861 <td><tt>(basefield == ios_base::hex)</tt></td>
18862 <td><tt>%X</tt></td>
18865 <td><tt>basefield == 0</tt></td>
18866 <td><tt>%i</tt></td>
18869 <td>for a <del>signed integral type</del><ins>signed integer
18871 <td><tt>%d</tt></td>
18874 <td>for a <del>unsigned integral type</del><ins>unsigned integer
18876 <td><tt>%u</tt></td>
18884 23.1 [container.requirements] table 80...
18887 Table 89: Container requirements
18891 <th>expression</th>
18892 <th>return type</th>
18893 <th>operational semantics</th>
18894 <th>assertion/note/pre/post-condition</th>
18895 <th>complexity</th>
18900 <td><tt>X::difference_type</tt></td>
18901 <td><del>signed integral type</del><ins>signed integer type</ins></td>
18903 <td>is identical to the difference type of <tt>X::iterator</tt>
18904 and <tt>X::const_iterator</tt></td>
18905 <td>compile time</td>
18908 <td><tt>X::size_type</tt></td>
18909 <td><del>unsigned integral type</del><ins>unsigned integer type</ins></td>
18911 <td><tt>size_type</tt> can represent any non-negative value of
18912 <tt>difference_type</tt></td>
18913 <td>compile time</td>
18920 24.1 [iterator.requirements] paragraph 1...
18923 Iterators are a generalization of pointers that allow a C++ program to
18924 work with different data structures (containers) in a uniform manner.
18925 To be able to construct template algorithms that work correctly and
18926 efficiently on different types of data structures, the library
18927 formalizes not just the interfaces but also the semantics and
18928 complexity assumptions of iterators. All input iterators
18929 <code>i</code> support the expression <code>*i</code>, resulting in a
18930 value of some class, enumeration, or built-in type <code>T</code>,
18931 called the <i>value type</i> of the iterator. All output iterators
18932 support the expression <code>*i = o</code> where <code>o</code> is a
18933 value of some type that is in the set of types that are
18934 <i>writable</i> to the particular iterator type of <code>i</code>. All
18935 iterators <code>i</code> for which the expression <code>(*i).m</code>
18936 is well-defined, support the expression <code>i->m</code> with the
18937 same semantics as <code>(*i).m</code>. For every iterator type
18938 <code>X</code> for which equality is defined, there is a corresponding
18939 <del>signed integral type</del> <ins>signed integer type</ins> called
18940 the <i>difference type</i> of the iterator.
18944 I'm a little unsure of this change. Previously this paragraph would
18945 allow instantiations of <tt>linear_congruential_engine</tt> on
18946 <tt>char</tt>, <tt>wchar_t</tt>, <tt>bool</tt>, and other types. The
18947 new wording prohibits this.
18948 26.4.3.1 [rand.eng.lcong] paragraph 2...
18951 The template parameter <code>UIntType</code> shall denote an
18952 <del>unsigned integral type</del><ins>unsigned integer type</ins>
18953 large enough to store values as large as <code>m - 1</code>. If the
18954 template parameter <code>m</code> is 0, the modulus <code>m</code>
18955 used throughout this section 26.4.3.1 is
18956 <code>numeric_limits<result_type>::max()</code> plus 1. [Note:
18957 The result need not be representable as a value of type
18958 <code>result_type</code>. --end note] Otherwise, the following
18959 relations shall hold: <code>a < m</code> and <code>c <
18964 Same rationale as the previous change.
18965 26.4.4.4 [rand.adapt.xor] paragraph 6...
18968 Both <code>Engine1::result_type</code> and
18969 <code>Engine2::result_type</code> shall denote (possibly different)
18970 <del>unsigned integral types</del><ins>unsigned integer types</ins>.
18971 The member <i>result_type</i> shall denote either the type
18972 <i>Engine1::result_type</i> or the type <i>Engine2::result_type</i>,
18973 whichever provides the most storage according to clause 3.9.1.
18977 26.4.7.1 [rand.util.seedseq] paragraph 7...
18980 <i>Requires:</i><code>RandomAccessIterator</code> shall meet the
18981 requirements of a random access iterator (24.1.5) such that
18982 <code>iterator_traits<RandomAccessIterator>::value_type</code>
18983 shall denote an <del>unsigned integral type</del><ins>unsigned integer
18984 type</ins> capable of accomodating 32-bit quantities.
18988 By making this change, integral types that happen to have a signed
18989 representation, but are not signed integer types, would no longer be
18990 required to use a two's complement representation. This may go against
18991 the original intent, and should be reviewed.
18992 29.4 [atomics.types.operations] paragraph 24...
18995 <i>Remark:</i> For <del>signed integral types</del><ins>signed integer
18996 types</ins>, arithmetic is defined using two's complement
18997 representation. There are no undefined results. For address types, the
18998 result may be an undefined address, but the operations otherwise have
18999 no undefined behavior.
19008 <h3><a name="874"></a>874. Missing <tt>initializer_list</tt> constructor for <tt>discrete_distribution</tt></h3>
19009 <p><b>Section:</b> 26.4.8.5.1 [rand.dist.samp.discrete] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
19010 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-08-22</p>
19011 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#rand.dist.samp.discrete">active issues</a> in [rand.dist.samp.discrete].</p>
19012 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.dist.samp.discrete">issues</a> in [rand.dist.samp.discrete].</p>
19013 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
19014 <p><b>Discussion:</b></p>
19016 During the Sophia Antipolis meeting it was decided to separate from <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#793">793</a> a
19017 subrequest that adds initializer list support to
19018 <tt>discrete_distribution</tt>, specifically,
19019 the issue proposed to add a c'tor taking a <tt>initializer_list<double></tt>.
19024 <p><b>Proposed resolution:</b></p>
19028 In 26.4.8.5.1 [rand.dist.samp.discrete]/1, class <tt>discrete_distribution</tt>,
19029 just <em>before</em> the member declaration
19032 <blockquote><pre>explicit discrete_distribution(const param_type& parm);
19033 </pre></blockquote>
19039 <blockquote><pre>discrete_distribution(initializer_list<double> wl);
19040 </pre></blockquote>
19045 Between p.4 and p.5 of the same section insert a new
19046 paragraph as part of the new member description:
19049 <blockquote><pre>discrete_distribution(initializer_list<double> wl);
19053 <i>Effects:</i> Same as <tt>discrete_distribution(wl.begin(), wl.end())</tt>.
19064 <h3><a name="875"></a>875. Missing <tt>initializer_list</tt> constructor for <tt>piecewise_constant_distribution</tt></h3>
19065 <p><b>Section:</b> 26.4.8.5.2 [rand.dist.samp.pconst] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
19066 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-08-22</p>
19067 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#rand.dist.samp.pconst">active issues</a> in [rand.dist.samp.pconst].</p>
19068 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.dist.samp.pconst">issues</a> in [rand.dist.samp.pconst].</p>
19069 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
19070 <p><b>Discussion:</b></p>
19072 During the Sophia Antipolis meeting it was decided to separate from
19073 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#794">794</a> a subrequest that adds initializer list support to
19074 <tt>piecewise_constant_distribution</tt>, specifically, the issue proposed
19075 to add a c'tor taking a <tt>initializer_list<double></tt> and a <tt>Callable</tt> to evaluate
19076 weight values. For consistency with the remainder of this class and
19077 the remainder of the <tt>initializer_list</tt>-aware library the author decided to
19078 change the list argument type to the template parameter <tt>RealType</tt>
19079 instead. For the reasoning to use <tt>Func</tt> instead of <tt>Func&&</tt> as c'tor
19080 function argument see issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#793">793</a>.
19084 <p><b>Proposed resolution:</b></p>
19088 In 26.4.8.5.2 [rand.dist.samp.pconst]/1, class <tt>piecewise_constant_distribution</tt>,
19089 just <em>before</em> the member declaration
19092 <blockquote><pre>explicit piecewise_constant_distribution(const param_type& parm);
19093 </pre></blockquote>
19099 <blockquote><pre>template<typename Func>
19100 piecewise_constant_distribution(initializer_list<RealType> bl, Func fw);
19101 </pre></blockquote>
19106 Between p.4 and p.5 of the same section insert a series of
19107 new paragraphs nominated below as [p5_1], [p5_2], and [p5_3]
19108 as part of the new member description:
19111 <blockquote><pre>template<typename Func>
19112 piecewise_constant_distribution(initializer_list<RealType> bl, Func fw);
19118 [p5_1] <i>Complexity:</i> Exactly <tt>nf = max(bl.size(), 1) - 1</tt> invocations of <tt>fw</tt>.
19122 [p5_2] <i>Requires:</i>
19127 <tt>fw</tt> shall be callable with one argument of type <tt>RealType</tt>, and shall
19128 return values of a type convertible to <tt>double</tt>;
19131 The relation <tt>0 < S = w<sub>0</sub>+. . .+w<sub>n-1</sub></tt> shall hold.
19132 For all sampled values <tt><i>x<sub>k</sub></i></tt> defined below, <tt>fw(<i>x<sub>k</sub></i>)</tt> shall return a weight
19133 value <tt><i>w<sub>k</sub></i></tt> that is non-negative, non-NaN, and non-infinity;
19136 If <tt>nf > 0</tt> let <tt>b<sub><i>k</i></sub> = *(bl.begin() + k), k = 0, . . . , bl.size()-1</tt> and the
19137 following relations shall hold for <tt>k = 0, . . . , nf-1: b<sub><i>k</i></sub> < b<sub><i>k+1</i></sub></tt>.
19142 [p5_3] <i>Effects:</i>
19147 <p>If <tt>nf == 0</tt>,</p>
19150 lets the sequence <tt>w</tt> have length <tt>n = 1</tt> and consist of the single
19151 value <tt>w<sub>0</sub> = 1</tt>, and
19154 lets the sequence <tt>b</tt> have length <tt>n+1</tt> with <tt>b<sub>0</sub> = 0</tt> and <tt>b<sub>1</sub> = 1</tt>.
19163 sets <tt>n = nf</tt>, and <tt>[bl.begin(), bl.end())</tt> shall form the sequence <tt>b</tt> of
19164 length <tt>n+1</tt>, and
19167 <p>lets the sequences <tt>w</tt> have length <tt>n</tt> and for each <tt>k = 0, . . . ,n-1</tt>,
19169 <blockquote><pre>x<sub><i>k</i></sub> = 0.5*(b<sub><i>k+1</i></sub> + b<sub><i>k</i></sub>)
19170 w<sub><i>k</i></sub> = fw(x<sub><i>k</i></sub>)
19171 </pre></blockquote>
19178 Constructs a <tt>piecewise_constant_distribution</tt> object with
19179 the above computed sequence <tt>b</tt> as the interval boundaries
19180 and with the probability densities:
19182 <blockquote><pre>ρ<sub><i>k</i></sub> = w<sub><i>k</i></sub>/(S * (b<sub><i>k+1</i></sub> - b<sub><i>k</i></sub>)) for k = 0, . . . , n-1.
19183 </pre></blockquote>
19198 <h3><a name="876"></a>876. <tt>basic_string</tt> access operations should give stronger guarantees</h3>
19199 <p><b>Section:</b> 21.3 [basic.string] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
19200 <b>Submitter:</b> Daniel Krügler <b>Date:</b> 2008-08-22</p>
19201 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#basic.string">active issues</a> in [basic.string].</p>
19202 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#basic.string">issues</a> in [basic.string].</p>
19203 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
19204 <p><b>Discussion:</b></p>
19206 During the Sophia Antipolis meeting it was decided to split-off some
19208 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2647.html">n2647</a>
19209 ("Concurrency modifications for <tt>basic_string</tt>")
19210 proposal into a separate issue, because these weren't actually
19211 concurrency-related. The here proposed changes refer to the recent
19213 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2668.htm">n2668</a>
19214 and attempt to take advantage of the
19215 stricter structural requirements.
19218 Indeed there exists some leeway for more guarantees that would be
19219 very useful for programmers, especially if interaction with transactionary
19220 or exception-unaware C API code is important. This would also allow
19221 compilers to take advantage of more performance optimizations, because
19222 more functions can have throw() specifications. This proposal uses the
19223 form of "Throws: Nothing" clauses to reach the same effect, because
19224 there already exists a different issue in progress to clean-up the current
19225 existing "schizophrenia" of the standard in this regard.
19228 Due to earlier support for copy-on-write, we find the following
19229 unnecessary limitations for C++0x:
19234 Missing no-throw guarantees: <tt>data()</tt> and <tt>c_str()</tt> simply return
19235 a pointer to their guts, which is a non-failure operation. This should
19236 be spelled out. It is also noteworthy to mention that the same
19237 guarantees should also be given by the size query functions,
19238 because the combination of pointer to content and the length is
19239 typically needed during interaction with low-level API.
19242 Missing complexity guarantees: <tt>data()</tt> and <tt>c_str()</tt> simply return
19243 a pointer to their guts, which is guaranteed O(1). This should be
19247 Missing reading access to the terminating character: Only the
19248 const overload of <tt>operator[]</tt> allows reading access to the terminator
19249 char. For more intuitive usage of strings, reading access to this
19250 position should be extended to the non-const case. In contrast
19251 to C++03 this reading access should now be homogeneously
19257 The proposed resolution is split into a main part (A) and a
19258 secondary part (B) (earlier called "Adjunct Adjunct Proposal").
19259 (B) extends (A) by also making access to index position
19260 size() of the at() overloads a no-throw operation. This was
19261 separated, because this part is theoretically observable in
19262 specifically designed test programs.
19266 <p><b>Proposed resolution:</b></p>
19271 <p>In 21.3.4 [string.capacity], just after p. 1 add a new paragraph:
19274 <i>Throws:</i> Nothing.
19280 In 21.3.5 [string.access] <em>replace</em> p. 1 by the following <em>4</em> paragraghs:
19285 <i>Requires:</i> <tt>pos ≤ size()</tt>.
19288 <i>Returns:</i> If <tt>pos < size()</tt>, returns <tt>*(begin() + pos)</tt>. Otherwise, returns
19289 a reference to a <tt>charT()</tt> that shall not be modified.
19292 <i>Throws:</i> Nothing.
19295 <i>Complexity:</i> Constant time.
19302 In 21.3.7.1 [string.accessors] replace the now <em>common</em> returns
19303 clause of <tt>c_str()</tt> and <tt>data()</tt> by the following <em>three</em> paragraphs:
19307 <i>Returns:</i> A pointer <tt>p</tt> such that <tt>p+i == &operator[](i)</tt> for each <tt>i</tt>
19308 in <tt>[0, size()]</tt>.
19311 <i>Throws:</i> Nothing.
19314 <i>Complexity:</i> Constant time.
19324 In 21.3.5 [string.access] <em>replace</em> p.2 and p.3 by:
19328 <i>Requires:</i> <tt>pos ≤ size()</tt>
19331 <i>Throws:</i> <tt>out_of_range</tt> if <tt>pos > size()</tt>.
19345 <h3><a name="877"></a>877. to <tt>throw()</tt> or to <i>Throw:</i> Nothing.</h3>
19346 <p><b>Section:</b> 17 [library] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
19347 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-08-23</p>
19348 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#library">issues</a> in [library].</p>
19349 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
19350 <p><b>Discussion:</b></p>
19354 the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2691.pdf">working
19355 draft</a> have introduced a gratuitous inconsistency with the C++ 2003
19356 version of the specification with respect to exception guarantees
19357 provided by standard functions. While the C++ 2003 standard
19358 consistenly uses the empty exception specification, <tt>throw()</tt>,
19359 to declare functions that are guaranteed not to throw exceptions, the
19360 current working draft contains a number of "<i>Throws:</i> Nothing."
19361 clause to specify essentially the same requirement. The difference
19362 between the two approaches is that the former specifies the behavior
19363 of programs that violate the requirement (<tt>std::unexpected()</tt>
19364 is called) while the latter leaves the behavior undefined.
19369 A survey of the working draft reveals that there are a total of 209
19370 occurrences of <tt>throw()</tt> in the library portion of the spec,
19371 the majority in clause 18, a couple (literally) in 19, a handful in
19372 20, a bunch in 22, four in 24, one in 27, and about a dozen in D.9.
19377 There are also 203 occurrences of "<i>Throws:</i> Nothing." scattered
19378 throughout the spec.
19383 While sometimes there are good reasons to use the "<i>Throws:</i>
19384 Nothing." approach rather than making use of <tt>throw()</tt>, these
19385 reasons do not apply in most of the cases where this new clause has
19386 been introduced and the empty exception specification would be a
19392 First, functions declared with the empty exception specification
19393 permit compilers to generate better code for calls to such
19394 functions. In some cases, the compiler might even be able to eliminate
19395 whole chunks of user-written code when instantiating a generic
19396 template on a type whose operations invoked from the template
19397 specialization are known not to throw. The prototypical example are
19398 the <tt>std::uninitialized_copy()</tt>
19399 and <tt>std::uninitialized_fill()</tt> algorithms where the
19400 entire <tt>catch(...)</tt> block can be optimized away.
19405 For example, given the following definition of
19406 the <tt>std::uninitialized_copy</tt> function template and a
19407 user-defined type <tt>SomeType</tt>:
19411 <pre>template <class InputIterator, class ForwardIterator>
19413 uninitialized_copy (InputIterator first, InputIterator last, ForwardIterator res)
19415 typedef iterator_traits<ForwardIterator>::value_type ValueType;
19417 ForwardIterator start = res;
19420 for (; first != last; ++first, ++res)
19421 ::new (&*res) ValueType (*first);
19424 for (; start != res; --start)
19425 (&*start)->~ValueType ();
19432 SomeType (const SomeType&) <ins>throw ()</ins>;
19437 compilers are able to emit the following efficient specialization
19438 of <tt>std::uninitialized_copy<const SomeType*, SomeType*></tt>
19439 (note that the <tt>catch</tt> block has been optimized away):
19443 <pre>template <> SomeType*
19444 uninitialized_copy (const SomeType *first, const SomeType *last, SomeType *res)
19446 for (; first != last; ++first, ++res)
19447 ::new (res) SomeType (*first);
19454 Another general example is default constructors which, when decorated
19455 with <tt>throw()</tt>, allow the compiler to eliminate the
19456 implicit <tt>try</tt> and <tt>catch</tt> blocks that it otherwise must
19457 emit around each the invocation of the constructor
19458 in <i>new-expressions</i>.
19463 For example, given the following definitions of
19464 class <tt>MayThrow</tt> and <tt>WontThrow</tt> and the two
19469 <pre>struct MayThrow {
19474 WontThrow () <ins>throw ()</ins>;
19477 MayThrow *a = new MayThrow [N];
19478 WontThrow *b = new WontThrow [N];</pre>
19483 the compiler generates the following code for the first statement:
19489 MayThrow *first = operator new[] (N * sizeof (*a));
19490 MayThrow *last = first + N;
19491 MayThrow *next = first;
19493 for ( ; next != last; ++next)
19494 new (next) MayThrow;
19497 for ( ; first != first; --next)
19498 next->~MayThrow ();
19499 operator delete[] (first);
19507 but it is can generate much more compact code for the second statement:
19511 <pre>WontThrow *b = operator new[] (N * sizeof (*b));
19512 WontThrow *last = b + N;
19513 for (WontThrow *next = b; next != last; ++next)
19514 new (next) WontThrow;
19519 Second, in order for users to get the maximum benefit out of the new
19520 <tt>std::has_nothrow_xxx</tt> traits when using standard library types
19521 it will be important for implementations to decorate all non throwing
19522 copy constructors and assignment operators with <tt>throw()</tt>. Note
19523 that while an optimizer may be able to tell whether a function without
19524 an explicit exception specification can throw or not based on its
19525 definition, it can only do so when it can see the source code of the
19526 definition. When it can't it must assume that the function may
19527 throw. To prevent violating the One Definition Rule,
19528 the <tt>std::has_nothrow_xxx</tt> trait must return the most
19529 pessimistic guess across all translation units in the program, meaning
19530 that <tt>std::has_nothrow_xxx<T>::value</tt> must evaluate to
19531 <tt>false</tt> for any <tt>T</tt> whose <tt>xxx</tt>
19532 (where <tt>xxx</tt> is default or copy ctor, or assignment operator)
19533 is defined out-of-line.
19538 <b>Counterarguments:</b>
19543 During the discussion of this issue
19544 on <a href="mailto:c++std-lib@accu.org">c++std-lib@accu.org</a>
19545 (starting with post <tt>c++std-lib-21950</tt>) the following arguments
19546 in favor of the "<i>Throws:</i> Nothing." style have been made.
19553 Decorating functions that cannot throw with the empty exception
19554 specification can cause the compiler to generate suboptimal code for
19555 the implementation of the function when it calls other functions that
19556 aren't known to the compiler not to throw (i.e., that aren't decorated
19557 with <tt>throw()</tt> even if they don't actually throw). This is a
19558 common situation when the called function is a C or POSIX function.
19563 Alternate, proprietary mechanisms exist (such as
19564 GCC <a href="http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Attributes.html#index-g_t_0040code_007bnothrow_007d-function-attribute-2160"><tt>__attribute__((nothrow))</tt></a>
19566 C++ <a href="http://msdn.microsoft.com/en-us/library/49147z04%28VS.80%29.aspx"><tt>__declspec(nothrow)</tt></a>)
19567 that let implementers mark up non-throwing functions, often without
19568 the penalty mentioned in (1) above. The C++ standard shouldn't
19569 preclude the use of these potentially more efficient mechanisms.
19574 There are functions, especially function templates, that invoke
19575 user-defined functions that may or may not be
19576 declared <tt>throw()</tt>. Declaring such functions with the empty
19577 exception specification will cause compilers to generate suboptimal
19578 code when the user-defined function isn't also declared not to throw.
19585 The answer to point (1) above is that implementers can (and some have)
19586 declare functions with <tt>throw()</tt> to indicate to the compiler
19587 that calls to the function can safely be assumed not to throw in order
19588 to allow it to generate efficient code at the call site without also
19589 having to define the functions the same way and causing the compiler
19590 to generate suboptimal code for the function definition. That is, the
19591 function is declared with <tt>throw()</tt> in a header but it's
19592 defined without it in the source file. The <tt>throw()</tt>
19593 declaration is suppressed when compiling the definition to avoid
19594 compiler errors. This technique, while strictly speaking no permitted
19595 by the language, is safe and has been employed in practice. For
19596 example, the GNU C library takes this approach. Microsoft Visual C++
19597 takes a similar approach by simply assuming that no function with C
19598 language linkage can throw an exception unless it's explicitly
19599 declared to do so using the language extension <tt>throw(...)</tt>.
19604 Our answer to point (2) above is that there is no existing practice
19605 where C++ Standard Library implementers have opted to make use of the
19606 proprietary mechanisms to declare functions that don't throw. The
19607 language provides a mechanism specifically designed for this
19608 purpose. Avoiding its use in the specification itself in favor of
19609 proprietary mechanisms defeats the purpose of the feature. In
19610 addition, making use of the empty exception specification
19611 inconsistently, in some areas of the standard, while conspicuously
19612 avoiding it and making use of the "<i>Throws:</i> Nothing." form in
19613 others is confusing to users.
19618 The answer to point (3) is simply to exercise caution when declaring
19619 functions and especially function templates with the empty exception
19620 specification. Functions that required not to throw but that may call
19621 back into user code are poor candidates for the empty exception
19622 specification and should instead be specified using "<i>Throws:</i>
19627 <p><b>Proposed resolution:</b></p>
19630 We propose two possible solutions. Our recommendation is to adopt
19641 Except for functions or function templates that make calls back to
19642 user-defined functions that may not be declared <tt>throw()</tt>
19643 replace all occurrences of the "<i>Throws:</i> Nothing." clause with
19644 the empty exception specification. Functions that are required not to
19645 throw but that make calls back to user code should be specified to
19646 "<i>Throw:</i> Nothing."
19656 For consistency, replace all occurrences of the empty exception
19657 specification with a "<i>Throws:</i> Nothing." clause.
19665 <h3><a name="878"></a>878. <tt>forward_list</tt> preconditions</h3>
19666 <p><b>Section:</b> 23.2.3 [forwardlist] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
19667 <b>Submitter:</b> Martin Sebor <b>Date:</b> 2008-08-23</p>
19668 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#New">New</a> status.</p>
19669 <p><b>Discussion:</b></p>
19672 <tt>forward_list</tt> member functions that take
19673 a <tt>forward_list::iterator</tt> (denoted <tt>position</tt> in the
19674 function signatures) argument have the following precondition:
19679 <i>Requires:</i> <tt>position</tt> is dereferenceable or equal
19680 to <tt>before_begin()</tt>.
19685 I believe what's actually intended is this:
19690 <i>Requires:</i> <tt>position</tt> is in the range
19691 [<tt>before_begin()</tt>, <tt>end()</tt>).
19696 That is, when it's dereferenceable, <tt>position</tt> must point
19697 into <tt>*this</tt>, not just any <tt>forward_list</tt> object.
19701 <p><b>Proposed resolution:</b></p>
19704 Change the <i>Requires</i> clause as follows:
19709 <i>Requires:</i> <tt>position</tt> is <ins>in the range
19710 [<tt>before_begin()</tt>, <tt>end()</tt>)</ins> <del>dereferenceable
19711 or equal to <tt>before_begin()</tt></del>.