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">N2940=09-0130</td>
20 <td align="left">Date:</td>
21 <td align="left">2009-08-02</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 R66)</h1>
34 <p>Reference ISO/IEC IS 14882:2003(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:2003(E) document.
49 <p>This document contains only library issues which are actively being
50 considered by the Library Working Group, i.e., 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>, or <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>Prior to Revision 14, library issues lists existed in two slightly
62 different versions; a Committee Version and a Public
63 Version. Beginning with Revision 14 the two versions were combined
64 into a single version.</p>
66 <p>This document includes <i>[bracketed italicized notes]</i> as a
67 reminder to the LWG of current progress on issues. Such notes are
68 strictly unofficial and should be read with caution as they may be
69 incomplete or incorrect. Be aware that LWG support for a particular
70 resolution can quickly change if new viewpoints or killer examples are
71 presented in subsequent discussions.</p>
73 <p>For the most current official version of this document see
74 <a href="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/jtc1/sc22/wg21/</a>.
75 Requests for further information about this document should include
76 the document number above, reference ISO/IEC 14882:2003(E), and be
77 submitted to Information Technology Industry Council (ITI), 1250 Eye
78 Street NW, Washington, DC 20005.</p>
80 <p>Public information as to how to obtain a copy of the C++ Standard,
81 join the standards committee, submit an issue, or comment on an issue
82 can be found in the comp.std.c++ FAQ.
86 <h2>Revision History</h2>
89 2009-07-31 post-Frankfurt mailing.
91 <li><b>Summary:</b><ul>
92 <li>250 open issues, down by 128.</li>
93 <li>936 closed issues, up by 171.</li>
94 <li>1186 issues total, up by 43.</li>
96 <li><b>Details:</b><ul>
97 <li>Added the following NAD issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1164">1164</a>.</li>
98 <li>Added the following NAD Concepts issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1149">1149</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1167">1167</a>.</li>
99 <li>Added the following NAD Editorial issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1168">1168</a>.</li>
100 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1144">1144</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1145">1145</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1146">1146</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1147">1147</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1148">1148</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1150">1150</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1151">1151</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1152">1152</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1153">1153</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1154">1154</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1155">1155</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1156">1156</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1158">1158</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1159">1159</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1166">1166</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1169">1169</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1170">1170</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1171">1171</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1172">1172</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1173">1173</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1174">1174</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1175">1175</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1176">1176</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1177">1177</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1179">1179</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1180">1180</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1181">1181</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1182">1182</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1183">1183</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1184">1184</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1185">1185</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1186">1186</a>.</li>
101 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1160">1160</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1161">1161</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1162">1162</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1163">1163</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1165">1165</a>.</li>
102 <li>Added the following Ready issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1178">1178</a>.</li>
103 <li>Added the following Review issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1157">1157</a>.</li>
104 <li>Changed the following issues from Open to Dup: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#750">750</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#895">895</a>.</li>
105 <li>Changed the following issues from Open to NAD: <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#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#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#290">290</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#309">309</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#342">342</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#343">343</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#382">382</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#394">394</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#398">398</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#417">417</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#418">418</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#421">421</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#459">459</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#492">492</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#502">502</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#503">503</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#546">546</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#573">573</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#582">582</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#585">585</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#597">597</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#606">606</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#614">614</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#632">632</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#721">721</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#747">747</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#751">751</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#833">833</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#941">941</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#992">992</a>.</li>
106 <li>Changed the following issues from Review to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1003">1003</a>.</li>
107 <li>Changed the following issues from Tentatively NAD to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#568">568</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#644">644</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#667">667</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#669">669</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#701">701</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#702">702</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#785">785</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#863">863</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#901">901</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#903">903</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#946">946</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#988">988</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#995">995</a>.</li>
108 <li>Changed the following issues from Tentatively Ready to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1002">1002</a>.</li>
109 <li>Changed the following issues from New to NAD Concepts: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1124">1124</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1127">1127</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1128">1128</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1139">1139</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1140">1140</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1141">1141</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1142">1142</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1143">1143</a>.</li>
110 <li>Changed the following issues from Open to NAD Concepts: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#902">902</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#989">989</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1000">1000</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1007">1007</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1010">1010</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1015">1015</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1016">1016</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1017">1017</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1018">1018</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1026">1026</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1027">1027</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1028">1028</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1029">1029</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1032">1032</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1036">1036</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1057">1057</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1059">1059</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1072">1072</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1078">1078</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1081">1081</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1082">1082</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1083">1083</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1084">1084</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1085">1085</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1086">1086</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1092">1092</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1096">1096</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1105">1105</a>.</li>
111 <li>Changed the following issues from Review to NAD Concepts: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1001">1001</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1005">1005</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1080">1080</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1087">1087</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1111">1111</a>.</li>
112 <li>Changed the following issues from Tentatively NAD to NAD Concepts: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#912">912</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#918">918</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1074">1074</a>.</li>
113 <li>Changed the following issues from Tentatively NAD Editorial to NAD Concepts: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#927">927</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1109">1109</a>.</li>
114 <li>Changed the following issues from Tentatively Ready to NAD Concepts: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#906">906</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#913">913</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#914">914</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#928">928</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1024">1024</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1063">1063</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1067">1067</a>.</li>
115 <li>Changed the following issues from Open to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#718">718</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#873">873</a>.</li>
116 <li>Changed the following issues from Tentatively NAD Editorial to 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#825">825</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#830">830</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#837">837</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#862">862</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#867">867</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#884">884</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#945">945</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#952">952</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#969">969</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#972">972</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#973">973</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#979">979</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1023">1023</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1058">1058</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1060">1060</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1061">1061</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1077">1077</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1101">1101</a>.</li>
117 <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#1013">1013</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1107">1107</a>.</li>
118 <li>Changed the following issues from Open to NAD Future: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#255">255</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#423">423</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#523">523</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#708">708</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#760">760</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#839">839</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#877">877</a>.</li>
119 <li>Changed the following issues from CD1 to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#823">823</a>.</li>
120 <li>Changed the following issues from NAD Editorial to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">299</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#484">484</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#532">532</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-active.html#594">594</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#676">676</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-active.html#724">724</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#811">811</a>, <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#872">872</a>.</li>
121 <li>Changed the following issues from Review to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#879">879</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#919">919</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#929">929</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#939">939</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#987">987</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1009">1009</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1093">1093</a>.</li>
122 <li>Changed the following issues from Tentatively NAD to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#458">458</a>.</li>
123 <li>Changed the following issues from Tentatively NAD Future to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#96">96</a>.</li>
124 <li>Changed the following issues from Tentatively Ready to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#910">910</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#915">915</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#932">932</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#940">940</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#974">974</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#976">976</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#999">999</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1011">1011</a>.</li>
125 <li>Changed the following issues from Open to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#149">149</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#419">419</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#430">430</a>, <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#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#630">630</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#696">696</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-active.html#716">716</a>, <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#788">788</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#838">838</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#857">857</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#876">876</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#881">881</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#883">883</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#886">886</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1004">1004</a>.</li>
126 <li>Changed the following issues from Review to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#780">780</a>.</li>
127 <li>Changed the following issues from Tentatively NAD to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#822">822</a>.</li>
128 <li>Changed the following issues from Tentatively Ready to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#934">934</a>.</li>
129 <li>Changed the following issues from NAD to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#871">871</a>.</li>
130 <li>Changed the following issues from Open to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#397">397</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#408">408</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#473">473</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-active.html#836">836</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#889">889</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#893">893</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#930">930</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#954">954</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#962">962</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#967">967</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#968">968</a>.</li>
131 <li>Changed the following issues from Tentatively NAD to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#668">668</a>.</li>
132 <li>Changed the following issues from Tentatively Ready to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#950">950</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1100">1100</a>.</li>
133 <li>Changed the following issues from Open to Tentatively NAD: <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-active.html#617">617</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#625">625</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#971">971</a>.</li>
134 <li>Changed the following issues from Open to Tentatively NAD Future: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1031">1031</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1062">1062</a>.</li>
135 <li>Changed the following issues from Open to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1019">1019</a>.</li>
136 <li>Changed the following issues from Tentatively Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#688">688</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#765">765</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#810">810</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#814">814</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#853">853</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#869">869</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#878">878</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#888">888</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#890">890</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#898">898</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#899">899</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#904">904</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#907">907</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#909">909</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#922">922</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#925">925</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#931">931</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#938">938</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#943">943</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#948">948</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#949">949</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#965">965</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#970">970</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#975">975</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#981">981</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#982">982</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#984">984</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#986">986</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#990">990</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#991">991</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#993">993</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#994">994</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#997">997</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#998">998</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1006">1006</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1014">1014</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1021">1021</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1037">1037</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1038">1038</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1039">1039</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1040">1040</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1044">1044</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1045">1045</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1065">1065</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1066">1066</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1070">1070</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1073">1073</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1103">1103</a>.</li>
141 2009-06-19 pre-Frankfurt mailing.
143 <li><b>Summary:</b><ul>
144 <li>378 open issues, up by 32.</li>
145 <li>765 closed issues, up by 0.</li>
146 <li>1143 issues total, up by 32.</li>
148 <li><b>Details:</b><ul>
149 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1115">1115</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1116">1116</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1117">1117</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1118">1118</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1119">1119</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1120">1120</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1121">1121</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1122">1122</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1123">1123</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1124">1124</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1125">1125</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1126">1126</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1127">1127</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1128">1128</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1129">1129</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1130">1130</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1131">1131</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1132">1132</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1133">1133</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1134">1134</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1135">1135</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1136">1136</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1137">1137</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1138">1138</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1139">1139</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1140">1140</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1141">1141</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1142">1142</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1143">1143</a>.</li>
150 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1112">1112</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1113">1113</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1114">1114</a>.</li>
151 <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#937">937</a>.</li>
152 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#696">696</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-active.html#727">727</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#900">900</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#911">911</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#916">916</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#917">917</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#920">920</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#933">933</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#935">935</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#941">941</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#947">947</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#951">951</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#953">953</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#954">954</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#955">955</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#956">956</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#977">977</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#978">978</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#985">985</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#989">989</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#996">996</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1033">1033</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1054">1054</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1056">1056</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1057">1057</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1059">1059</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1062">1062</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1068">1068</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1069">1069</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1071">1071</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1072">1072</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1076">1076</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1090">1090</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1092">1092</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1096">1096</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1098">1098</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1099">1099</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1105">1105</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1106">1106</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1108">1108</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1110">1110</a>.</li>
153 <li>Changed the following issues from Review to Open: <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#971">971</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#992">992</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1004">1004</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1010">1010</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1015">1015</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1019">1019</a>.</li>
154 <li>Changed the following issues from New to Review: <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-active.html#835">835</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#897">897</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#919">919</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#939">939</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#957">957</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#983">983</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1001">1001</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1080">1080</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1091">1091</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1093">1093</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1094">1094</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1095">1095</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1097">1097</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1102">1102</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1104">1104</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1111">1111</a>.</li>
155 <li>Changed the following issues from Open to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#921">921</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#987">987</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1087">1087</a>.</li>
156 <li>Changed the following issues from New to Tentatively NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#568">568</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#701">701</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#702">702</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#785">785</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#863">863</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#903">903</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#912">912</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#918">918</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#946">946</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#995">995</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1074">1074</a>.</li>
157 <li>Changed the following issues from Open to Tentatively NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#458">458</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#644">644</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#669">669</a>.</li>
158 <li>Changed the following issues from Review to Tentatively NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#901">901</a>.</li>
159 <li>Changed the following issues from Tentatively Ready to Tentatively NAD: <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-closed.html#988">988</a>.</li>
160 <li>Changed the following issues from New to Tentatively NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#837">837</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#862">862</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#867">867</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#927">927</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#945">945</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#952">952</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#969">969</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#972">972</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#973">973</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#979">979</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1058">1058</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1060">1060</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1061">1061</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1077">1077</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1101">1101</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1109">1109</a>.</li>
161 <li>Changed the following issues from Open to Tentatively 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#825">825</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#830">830</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#884">884</a>.</li>
162 <li>Changed the following issues from Review to Tentatively NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1023">1023</a>.</li>
163 <li>Changed the following issues from Open to Tentatively NAD Future: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#96">96</a>.</li>
164 <li>Changed the following issues from New to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#810">810</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#898">898</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#906">906</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#910">910</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#913">913</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#914">914</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#915">915</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#925">925</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#974">974</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#976">976</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#981">981</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#982">982</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#984">984</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#990">990</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#998">998</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#999">999</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1063">1063</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1067">1067</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1070">1070</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1073">1073</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1100">1100</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1103">1103</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1107">1107</a>.</li>
165 <li>Changed the following issues from Open to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#688">688</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#814">814</a>.</li>
166 <li>Changed the following issues from Review to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#899">899</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#907">907</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#909">909</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#934">934</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#938">938</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#940">940</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#943">943</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#950">950</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#965">965</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#970">970</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#975">975</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#986">986</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#991">991</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#993">993</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#994">994</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#997">997</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1002">1002</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1006">1006</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1011">1011</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1013">1013</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1014">1014</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1021">1021</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1024">1024</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1037">1037</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1038">1038</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1039">1039</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1040">1040</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1044">1044</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1045">1045</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1065">1065</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1066">1066</a>.</li>
171 2009-05-01 mid-term mailing.
173 <li><b>Summary:</b><ul>
174 <li>346 open issues, up by 19.</li>
175 <li>765 closed issues, up by 0.</li>
176 <li>1111 issues total, up by 19.</li>
178 <li><b>Details:</b><ul>
179 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1093">1093</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1094">1094</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1095">1095</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1096">1096</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1097">1097</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1098">1098</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1099">1099</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1100">1100</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1101">1101</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1102">1102</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1103">1103</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1104">1104</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1105">1105</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1106">1106</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1107">1107</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1108">1108</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1109">1109</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1110">1110</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1111">1111</a>.</li>
180 <li>Changed the following issues from DR to CD1: <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-defects.html#386">386</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#406">406</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#409">409</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#413">413</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#434">434</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#438">438</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#444">444</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#445">445</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#455">455</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#457">457</a>, <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-defects.html#469">469</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#533">533</a>.</li>
181 <li>Changed the following issues from Review to New: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1070">1070</a>.</li>
186 2009-03-20 post-Summit mailing.
188 <li><b>Summary:</b><ul>
189 <li>327 open issues, up by 96.</li>
190 <li>765 closed issues, up by 14.</li>
191 <li>1092 issues total, up by 110.</li>
193 <li><b>Details:</b><ul>
194 <li>Added the following NAD Editorial issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1022">1022</a>.</li>
195 <li>Added the following NAD Future issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1025">1025</a>.</li>
196 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#983">983</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#984">984</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#985">985</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#989">989</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#990">990</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#995">995</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#996">996</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#998">998</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#999">999</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1001">1001</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1033">1033</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1054">1054</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1056">1056</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1057">1057</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1058">1058</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1059">1059</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1060">1060</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1061">1061</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1062">1062</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1063">1063</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1067">1067</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1068">1068</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1069">1069</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1071">1071</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1072">1072</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1073">1073</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1074">1074</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1076">1076</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1077">1077</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1080">1080</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1090">1090</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1091">1091</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1092">1092</a>.</li>
197 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#987">987</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1000">1000</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1007">1007</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1008">1008</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1016">1016</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1017">1017</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1018">1018</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1020">1020</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1026">1026</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1027">1027</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1028">1028</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1029">1029</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1030">1030</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1031">1031</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1032">1032</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1034">1034</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1035">1035</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1036">1036</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1041">1041</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1042">1042</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1046">1046</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1048">1048</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1051">1051</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1052">1052</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1053">1053</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1055">1055</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1064">1064</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1075">1075</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1078">1078</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1079">1079</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1081">1081</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1082">1082</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1083">1083</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1084">1084</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1085">1085</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1086">1086</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1087">1087</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1088">1088</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1089">1089</a>.</li>
198 <li>Added the following Review issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#986">986</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#991">991</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#992">992</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#993">993</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#994">994</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#997">997</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1002">1002</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1003">1003</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1004">1004</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1005">1005</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1006">1006</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1009">1009</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1010">1010</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1011">1011</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1013">1013</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1014">1014</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1015">1015</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1019">1019</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1021">1021</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1023">1023</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1024">1024</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1037">1037</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1038">1038</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1039">1039</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1040">1040</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1043">1043</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1044">1044</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1045">1045</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1047">1047</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1049">1049</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1050">1050</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1065">1065</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1066">1066</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1070">1070</a>.</li>
199 <li>Added the following Tentatively Ready issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#988">988</a>.</li>
200 <li>Changed the following issues from New to Dup: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#905">905</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#942">942</a>.</li>
201 <li>Changed the following issues from New to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#980">980</a>.</li>
202 <li>Changed the following issues from New to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#874">874</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#875">875</a>.</li>
203 <li>Changed the following issues from Open to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#732">732</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#793">793</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#794">794</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#800">800</a>.</li>
204 <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#683">683</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#892">892</a>.</li>
205 <li>Changed the following issues from Ready to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#803">803</a>.</li>
206 <li>Changed the following issues from NAD to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#466">466</a>.</li>
207 <li>Changed the following issues from NAD Future to Open: <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#138">138</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#149">149</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#219">219</a>.</li>
208 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#880">880</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#891">891</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#893">893</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#902">902</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#908">908</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#921">921</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#923">923</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#924">924</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#926">926</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#930">930</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#936">936</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#944">944</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#958">958</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#959">959</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#960">960</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#961">961</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#962">962</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#963">963</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#964">964</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#966">966</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#967">967</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#968">968</a>.</li>
209 <li>Changed the following issues from Ready to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#788">788</a>.</li>
210 <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#937">937</a>.</li>
211 <li>Changed the following issues from New to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#879">879</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#899">899</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#901">901</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#907">907</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#909">909</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#929">929</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#934">934</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#938">938</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#940">940</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#943">943</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#950">950</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#965">965</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#970">970</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#971">971</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#975">975</a>.</li>
212 <li>Changed the following issues from Open to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#817">817</a>.</li>
213 <li>Changed the following issues from New to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#904">904</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#922">922</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#928">928</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#931">931</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#932">932</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#948">948</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#949">949</a>.</li>
214 <li>Changed the following issues from Open to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#890">890</a>.</li>
215 <li>Changed the following issues from Review to Tentatively Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#765">765</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-defects.html#853">853</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#869">869</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#878">878</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#888">888</a>.</li>
216 <li>Changed the following issues from Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#752">752</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#753">753</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#758">758</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#821">821</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#866">866</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#894">894</a>.</li>
221 2009-02-06 pre-Summit mailing.
223 <li><b>Summary:</b><ul>
224 <li>231 open issues, up by 44.</li>
225 <li>751 closed issues, up by 0.</li>
226 <li>982 issues total, up by 44.</li>
228 <li><b>Details:</b><ul>
229 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#939">939</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#940">940</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#941">941</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#942">942</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#943">943</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#944">944</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#945">945</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#946">946</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#947">947</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#948">948</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#949">949</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#950">950</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#951">951</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#952">952</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#953">953</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#954">954</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#955">955</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#956">956</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#957">957</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#958">958</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#959">959</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#960">960</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#961">961</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#962">962</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#963">963</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#964">964</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#965">965</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#966">966</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#967">967</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#968">968</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#969">969</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#970">970</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#971">971</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#972">972</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#973">973</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#974">974</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#975">975</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#976">976</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#977">977</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#978">978</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#979">979</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#980">980</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#981">981</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#982">982</a>.</li>
234 2008-12-05 mid-term mailing.
236 <li><b>Summary:</b><ul>
237 <li>187 open issues, up by 20.</li>
238 <li>751 closed issues, up by 0.</li>
239 <li>938 issues total, up by 20.</li>
241 <li><b>Details:</b><ul>
242 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#919">919</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#920">920</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#921">921</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#922">922</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#923">923</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#924">924</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#925">925</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#926">926</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#927">927</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#928">928</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#929">929</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#930">930</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#931">931</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#932">932</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#933">933</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#934">934</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#935">935</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#936">936</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#937">937</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#938">938</a>.</li>
247 2008-10-03 post-San Francisco mailing.
249 <li><b>Summary:</b><ul>
250 <li>167 open issues, down by 25.</li>
251 <li>751 closed issues, up by 65.</li>
252 <li>918 issues total, up by 40.</li>
254 <li><b>Details:</b><ul>
255 <li>Added the following CD1 issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#882">882</a>.</li>
256 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#879">879</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#880">880</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#891">891</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#893">893</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#897">897</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#898">898</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#899">899</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#900">900</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#901">901</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#902">902</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#903">903</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#904">904</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#905">905</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#906">906</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#907">907</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#908">908</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#909">909</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#910">910</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#911">911</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#912">912</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#913">913</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#914">914</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#915">915</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#916">916</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#917">917</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#918">918</a>.</li>
257 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#881">881</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#883">883</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#884">884</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#885">885</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#886">886</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#887">887</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#889">889</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#890">890</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#895">895</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#896">896</a>.</li>
258 <li>Added the following Pending NAD Editorial issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#892">892</a>.</li>
259 <li>Added the following Ready issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#894">894</a>.</li>
260 <li>Added the following Review issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#888">888</a>.</li>
261 <li>Changed the following issues from New to CD1: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#818">818</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#820">820</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#843">843</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#845">845</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#846">846</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#856">856</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#858">858</a>.</li>
262 <li>Changed the following issues from Ready to CD1: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#180">180</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#387">387</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#396">396</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#522">522</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#629">629</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#691">691</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#713">713</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#714">714</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#720">720</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#728">728</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#762">762</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#769">769</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#771">771</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#772">772</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#776">776</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#779">779</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#787">787</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#805">805</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#806">806</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#807">807</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#808">808</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#809">809</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#813">813</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#824">824</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#829">829</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#842">842</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#844">844</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#848">848</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#850">850</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#852">852</a>.</li>
263 <li>Changed the following issues from Review to CD1: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#23">23</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#675">675</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#692">692</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#698">698</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#709">709</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#734">734</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#804">804</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#823">823</a>.</li>
264 <li>Changed the following issues from WP to CD1: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#44">44</a>, <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#92">92</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#98">98</a>, <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#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#118">118</a>, <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#123">123</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>, <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#167">167</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#179">179</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#182">182</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>, <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#187">187</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198">198</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#200">200</a>, <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#202">202</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#214">214</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#221">221</a>, <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#228">228</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#230">230</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#231">231</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#233">233</a>, <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#235">235</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#238">238</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#239">239</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#240">240</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#243">243</a>, <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#248">248</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-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#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-defects.html#256">256</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-defects.html#259">259</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#260">260</a>, <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#264">264</a>, <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-defects.html#266">266</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#268">268</a>, <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#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#274">274</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#275">275</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#276">276</a>, <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#280">280</a>, <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#282">282</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#283">283</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>, <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#291">291</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#294">294</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>, <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#300">300</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#305">305</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#306">306</a>, <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#310">310</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#311">311</a>, <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#315">315</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#316">316</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#317">317</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#318">318</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#319">319</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#320">320</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#321">321</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322">322</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#324">324</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#325">325</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#327">327</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#328">328</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#329">329</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#331">331</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#333">333</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#334">334</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#335">335</a>, <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-defects.html#337">337</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#338">338</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#339">339</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#340">340</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#341">341</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#345">345</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#346">346</a>, <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-defects.html#349">349</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#352">352</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#354">354</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#355">355</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#358">358</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#359">359</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#360">360</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#363">363</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#364">364</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#365">365</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#370">370</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#373">373</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#375">375</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#379">379</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#380">380</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#381">381</a>, <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#384">384</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#389">389</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#391">391</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#395">395</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#400">400</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#402">402</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#403">403</a>, <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-defects.html#405">405</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#407">407</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#410">410</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#411">411</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#412">412</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#414">414</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#415">415</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#420">420</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#425">425</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#426">426</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#428">428</a>, <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-defects.html#435">435</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#436">436</a>, <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#442">442</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#443">443</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#448">448</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#449">449</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#453">453</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#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#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#488">488</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#496">496</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#518">518</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#519">519</a>, <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#524">524</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#527">527</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#534">534</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>, <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#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-defects.html#550">550</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#552">552</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#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#566">566</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#574">574</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#577">577</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#581">581</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#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#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#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#612">612</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#618">618</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#619">619</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#628">628</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#638">638</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>, <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#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#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-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#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-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-defects.html#685">685</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#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-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>, <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#712">712</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>
265 <li>Changed the following issues from Open to Dup: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#670">670</a>.</li>
266 <li>Changed the following issues from New to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#849">849</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#855">855</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#871">871</a>.</li>
267 <li>Changed the following issues from Open to NAD: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454">454</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#832">832</a>.</li>
268 <li>Changed the following issues from New to NAD Editorial: <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-closed.html#812">812</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#841">841</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#864">864</a>, <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#872">872</a>.</li>
269 <li>Changed the following issues from Open to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">299</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#484">484</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-active.html#631">631</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#704">704</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#742">742</a>.</li>
270 <li>Changed the following issues from Pending NAD Editorial to NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#532">532</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#594">594</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>.</li>
271 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#721">721</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#751">751</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#814">814</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#819">819</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#836">836</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#838">838</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#857">857</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>, <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-closed.html#873">873</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-closed.html#877">877</a>.</li>
272 <li>Changed the following issues from Pending NAD Editorial to Open: <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-active.html#625">625</a>.</li>
273 <li>Changed the following issues from Review to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#851">851</a>.</li>
274 <li>Changed the following issues from New to Ready: <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-defects.html#821">821</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#866">866</a>.</li>
275 <li>Changed the following issues from Open to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#753">753</a>.</li>
276 <li>Changed the following issues from Review to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#752">752</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#758">758</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#803">803</a>.</li>
277 <li>Changed the following issues from New to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#765">765</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-defects.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-defects.html#869">869</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#878">878</a>.</li>
278 <li>Changed the following issues from TC to TC1: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1">1</a>, <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#5">5</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#7">7</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#11">11</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#13">13</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#14">14</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#15">15</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#16">16</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#17">17</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#18">18</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#19">19</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#20">20</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#21">21</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#22">22</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#24">24</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#25">25</a>, <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#27">27</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#28">28</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#29">29</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#30">30</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#32">32</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#33">33</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#34">34</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#35">35</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#36">36</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#37">37</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#38">38</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#39">39</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#40">40</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#41">41</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#42">42</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#46">46</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#47">47</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#48">48</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#50">50</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#51">51</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#52">52</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#53">53</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#54">54</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#55">55</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#56">56</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#57">57</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#59">59</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#60">60</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#61">61</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#62">62</a>, <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#64">64</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#66">66</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#68">68</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69">69</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#70">70</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#71">71</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#74">74</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#75">75</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#78">78</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#79">79</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#80">80</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#83">83</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#90">90</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#106">106</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#108">108</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#110">110</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-defects.html#114">114</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#115">115</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#119">119</a>, <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#124">124</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#125">125</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#126">126</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>, <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>, <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#139">139</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#141">141</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#142">142</a>, <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>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#148">148</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#150">150</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#151">151</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#152">152</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#154">154</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#155">155</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#156">156</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#158">158</a>, <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#160">160</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#161">161</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#168">168</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#169">169</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#170">170</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#172">172</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#173">173</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#174">174</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#175">175</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#176">176</a>, <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#189">189</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#193">193</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#195">195</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>, <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>, <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>, <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>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#227">227</a>.</li>
283 2008-08-22 pre-San Francisco mailing.
285 <li><b>Summary:</b><ul>
286 <li>192 open issues, up by 9.</li>
287 <li>686 closed issues, up by 0.</li>
288 <li>878 issues total, up by 9.</li>
290 <li><b>Details:</b><ul>
291 <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-closed.html#873">873</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#874">874</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#877">877</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#878">878</a>.</li>
296 2008-07-28 mid-term mailing.
298 <li><b>Summary:</b><ul>
299 <li>183 open issues, up by 12.</li>
300 <li>686 closed issues, down by 4.</li>
301 <li>869 issues total, up by 8.</li>
303 <li><b>Details:</b><ul>
304 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#862">862</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#863">863</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-defects.html#866">866</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-defects.html#869">869</a>.</li>
305 <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>
306 <li>Changed the following issues from Pending WP to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#644">644</a>.</li>
307 <li>Changed the following issues from WP to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#387">387</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#629">629</a>.</li>
308 <li>Changed the following issues from Pending NAD Editorial to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#709">709</a>.</li>
313 2008-06-27 post-Sophia Antipolis mailing.
315 <li><b>Summary:</b><ul>
316 <li>171 open issues, down by 20.</li>
317 <li>690 closed issues, up by 43.</li>
318 <li>861 issues total, up by 23.</li>
320 <li><b>Details:</b><ul>
321 <li>Added the following NAD issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#840">840</a>.</li>
322 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#841">841</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#843">843</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#845">845</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.html#849">849</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.html#855">855</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.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>
323 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#839">839</a>.</li>
324 <li>Added the following Ready issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#842">842</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#844">844</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#848">848</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#850">850</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#852">852</a>.</li>
325 <li>Added the following Review issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#851">851</a>.</li>
326 <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>
327 <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>
328 <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>
329 <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>
330 <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-closed.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-closed.html#825">825</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#830">830</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#833">833</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#834">834</a>.</li>
331 <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>
332 <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>
333 <li>Changed the following issues from New to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#713">713</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#714">714</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#769">769</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#772">772</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#779">779</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#787">787</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#805">805</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#806">806</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#807">807</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#808">808</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#809">809</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#813">813</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#824">824</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#829">829</a>.</li>
334 <li>Changed the following issues from Open to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#180">180</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#396">396</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#522">522</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#720">720</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#762">762</a>.</li>
335 <li>Changed the following issues from Review to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#691">691</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#728">728</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#771">771</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#776">776</a>.</li>
336 <li>Changed the following issues from New to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#692">692</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#698">698</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#752">752</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.html#832">832</a>.</li>
337 <li>Changed the following issues from Open to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#23">23</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#675">675</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#734">734</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#803">803</a>.</li>
338 <li>Changed the following issues from Ready to Review: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#758">758</a>.</li>
339 <li>Changed the following issues from Ready to WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.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>
344 2008-05-16 pre-Sophia Antipolis mailing.
346 <li><b>Summary:</b><ul>
347 <li>191 open issues, up by 24.</li>
348 <li>647 closed issues, up by 1.</li>
349 <li>838 issues total, up by 25.</li>
351 <li><b>Details:</b><ul>
352 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.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-defects.html#820">820</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.html#824">824</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-defects.html#829">829</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#832">832</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#837">837</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#838">838</a>.</li>
353 <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>
358 2008-03-14 post-Bellevue mailing.
360 <li><b>Summary:</b><ul>
361 <li>167 open issues, down by 39.</li>
362 <li>646 closed issues, up by 65.</li>
363 <li>813 issues total, up by 26.</li>
365 <li><b>Details:</b><ul>
366 <li>Added the following Dup issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#795">795</a>.</li>
367 <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>
368 <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-closed.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-defects.html#804">804</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#805">805</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#806">806</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#807">807</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#808">808</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#809">809</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.html#812">812</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#813">813</a>.</li>
369 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#793">793</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#803">803</a>.</li>
370 <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>
371 <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>
372 <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>
373 <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>
374 <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>
375 <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>
376 <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>
377 <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>
378 <li>Changed the following issues from NAD Future to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#128">128</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#180">180</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#190">190</a>.</li>
379 <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-closed.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-defects.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-closed.html#732">732</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.html#747">747</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#750">750</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.html#760">760</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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>
380 <li>Changed the following issues from Ready to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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#688">688</a>.</li>
381 <li>Changed the following issues from New to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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>
382 <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-active.html#625">625</a>.</li>
383 <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-defects.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>
384 <li>Changed the following issues from Open to Ready: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.html#629">629</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#673">673</a>.</li>
385 <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>
386 <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-defects.html#728">728</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#771">771</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#776">776</a>.</li>
387 <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>
388 <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>
389 <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>
394 2008-02-01 pre-Bellevue mailing.
396 <li><b>Summary:</b><ul>
397 <li>206 open issues, up by 23.</li>
398 <li>581 closed issues, up by 0.</li>
399 <li>787 issues total, up by 23.</li>
401 <li><b>Details:</b><ul>
402 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.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-defects.html#771">771</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.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-defects.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-closed.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-defects.html#787">787</a>.</li>
403 <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>
404 <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>
405 <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>
406 <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>
407 <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>
412 2007-12-09 mid-term mailing.
414 <li><b>Summary:</b><ul>
415 <li>183 open issues, up by 11.</li>
416 <li>581 closed issues, down by 1.</li>
417 <li>764 issues total, up by 10.</li>
419 <li><b>Details:</b><ul>
420 <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-defects.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-closed.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-defects.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>
421 <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>
422 <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>
427 2007-10-19 post-Kona mailing.
429 <li><b>Summary:</b><ul>
430 <li>172 open issues, up by 4.</li>
431 <li>582 closed issues, up by 27.</li>
432 <li>754 issues total, up by 31.</li>
434 <li><b>Details:</b><ul>
435 <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-defects.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-closed.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-defects.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-closed.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-closed.html#750">750</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#751">751</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#752">752</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#753">753</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#754">754</a>.</li>
436 <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>
437 <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>
438 <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>
439 <li>Changed the following issues from New to Open: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#573">573</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-defects.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-closed.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-closed.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-closed.html#669">669</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#708">708</a>.</li>
440 <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>
441 <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>
442 <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-defects.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-defects.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>
443 <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>
444 <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-defects.html#691">691</a>.</li>
445 <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>
446 <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>
447 <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>
452 2007-09-09 pre-Kona mailing.
454 <li><b>Summary:</b><ul>
455 <li>168 open issues, up by 15.</li>
456 <li>555 closed issues, up by 0.</li>
457 <li>723 issues total, up by 15.</li>
459 <li><b>Details:</b><ul>
460 <li>Added the following New issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-defects.html#713">713</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.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-defects.html#720">720</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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>
465 2007-08-05 post-Toronto mailing.
467 <li><b>Summary:</b><ul>
468 <li>153 open issues, down by 5.</li>
469 <li>555 closed issues, up by 17.</li>
470 <li>708 issues total, up by 12.</li>
472 <li><b>Details:</b><ul>
473 <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-defects.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-closed.html#701">701</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-closed.html#708">708</a>.</li>
474 <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>
475 <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>
476 <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>
477 <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>
478 <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>
479 <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>
480 <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>
481 <li>Changed the following issues from Ready to Pending WP: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#644">644</a>.</li>
482 <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>
483 <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>
484 <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>
485 <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>
486 <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>
487 <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>
492 2007-06-23 pre-Toronto mailing.
494 <li><b>Summary:</b><ul>
495 <li>158 open issues, up by 13.</li>
496 <li>538 closed issues, up by 7.</li>
497 <li>696 issues total, up by 20.</li>
499 <li><b>Details:</b><ul>
500 <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-defects.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-defects.html#691">691</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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>
501 <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>
502 <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>
503 <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>
504 <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>
509 2007-05-06 post-Oxford mailing.
511 <li><b>Summary:</b><ul>
512 <li>145 open issues, down by 33.</li>
513 <li>531 closed issues, up by 53.</li>
514 <li>676 issues total, up by 20.</li>
516 <li><b>Details:</b><ul>
517 <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-closed.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-closed.html#669">669</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-defects.html#675">675</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#676">676</a>.</li>
518 <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>
519 <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>
520 <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>
521 <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>
522 <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-closed.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-active.html#149">149</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.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-closed.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>
523 <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>
524 <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>
525 <li>Changed the following issues from Tentatively Ready to Pending NAD Editorial: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.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-active.html#594">594</a>.</li>
526 <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>
527 <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-closed.html#644">644</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#646">646</a>.</li>
528 <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>
529 <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>
530 <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>
531 <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>
536 2007-03-09 pre-Oxford mailing.
538 <li><b>Summary:</b><ul>
539 <li>178 open issues, up by 37.</li>
540 <li>478 closed issues, up by 0.</li>
541 <li>656 issues total, up by 37.</li>
543 <li><b>Details:</b><ul>
544 <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-defects.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-closed.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-closed.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>
545 <li>Added the following Open issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#625">625</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#626">626</a>.</li>
546 <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-closed.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-closed.html#614">614</a>.</li>
547 <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-active.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>
548 <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-active.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>
549 <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>
554 2007-01-12 mid-term mailing.
556 <li><b>Summary:</b><ul>
557 <li>141 open issues, up by 11.</li>
558 <li>478 closed issues, down by 1.</li>
559 <li>619 issues total, up by 10.</li>
561 <li><b>Details:</b><ul>
562 <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#611">611</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#613">613</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#614">614</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-active.html#617">617</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#619">619</a>.</li>
567 2006-11-03 post-Portland mailing.
569 <li><b>Summary:</b><ul>
570 <li>130 open issues, up by 0.</li>
571 <li>479 closed issues, up by 17.</li>
572 <li>609 issues total, up by 17.</li>
574 <li><b>Details:</b><ul>
575 <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>
576 <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>
577 <li>Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#569">569</a> to Dup.</li>
578 <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-closed.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-closed.html#597">597</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#606">606</a> to Open.</li>
579 <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>
580 <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>
581 <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-active.html#594">594</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-closed.html#597">597</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#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#604">604</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#605">605</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#606">606</a>, <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#609">609</a>.</li>
586 2006-09-08 pre-Portland mailing.
588 <li><b>Summary:</b><ul>
589 <li>130 open issues, up by 6.</li>
590 <li>462 closed issues, down by 1.</li>
591 <li>592 issues total, up by 5.</li>
593 <li><b>Details:</b><ul>
594 <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#584">584</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#585">585</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-closed.html#587">587</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-defects.html#589">589</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-closed.html#591">591</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#592">592</a>.</li>
599 2006-06-23 mid-term mailing.
601 <li><b>Summary:</b><ul>
602 <li>124 open issues, up by 14.</li>
603 <li>463 closed issues, down by 1.</li>
604 <li>587 issues total, up by 13.</li>
606 <li><b>Details:</b><ul>
607 <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-defects.html#576">576</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#578">578</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-active.html#580">580</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-closed.html#582">582</a>.</li>
608 <li>Reopened <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#255">255</a>.</li>
609 <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>
614 2006-04-21 post-Berlin mailing.
616 <li><b>Summary:</b><ul>
617 <li>110 open issues, down by 16.</li>
618 <li>464 closed issues, up by 24.</li>
619 <li>574 issues total, up by 8.</li>
621 <li><b>Details:</b><ul>
622 <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#568">568</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#569">569</a>, <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-closed.html#571">571</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#572">572</a>.</li>
623 <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#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#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>
624 <li>Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#502">502</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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-defects.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#526">526</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#527">527</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528">528</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-active.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>
625 <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>
626 <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>
627 <li>Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#534">534</a> to Review.</li>
632 2006-02-24 pre-Berlin mailing.
634 <li><b>Summary:</b><ul>
635 <li>126 open issues, up by 31.</li>
636 <li>440 closed issues, up by 0.</li>
637 <li>566 issues total, up by 31.</li>
639 <li><b>Details:</b><ul>
640 <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#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-active.html#539">539</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>, <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#543">543</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-defects.html#545">545</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#546">546</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#548">548</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#550">550</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#552">552</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#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-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-closed.html#558">558</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-closed.html#560">560</a>, <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-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-defects.html#566">566</a>.</li>
641 <li>Moved <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#342">342</a> from Ready to Open.</li>
642 <li>Reopened <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#309">309</a>.</li>
647 2005-12-16 mid-term mailing.
649 <li><b>Summary:</b><ul>
650 <li>95 open issues.</li>
651 <li>440 closed issues.</li>
652 <li>535 issues total.</li>
654 <li><b>Details:</b><ul>
655 <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#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-active.html#532">532</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#533">533</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#535">535</a>.</li>
660 2005-10-14 post-Mont Tremblant mailing.
661 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>.
662 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.
663 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-closed.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.
664 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.
665 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.
666 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#500">500</a> from New to NAD.
667 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#518">518</a> from New to Review.
670 2005-07-03 pre-Mont Tremblant mailing.
671 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-defects.html#522">522</a>.
672 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#523">523</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#523">523</a>
675 2005-06 mid-term mailing.
676 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-closed.html#503">503</a>.
679 2005-04 post-Lillehammer mailing. All issues in "ready" status except
680 for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454">454</a> were moved to "DR" status, and all issues
681 previously in "DR" status were moved to "WP".
684 2005-03 pre-Lillehammer mailing.
687 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>.
690 2004-11 post-Redmond mailing. Reflects actions taken in Redmond.
693 2004-09 pre-Redmond mailing: reflects new proposed resolutions and
694 new issues received after the 2004-07 mailing. Added
695 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>.
698 2004-07 mid-term mailing: reflects new proposed resolutions and
699 new issues received after the post-Sydney mailing. Added
700 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>.
703 Post-Sydney mailing: reflects decisions made at the Sydney meeting.
704 Voted all "Ready" issues from R29 into the working paper.
705 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>.
708 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>.
711 Post-Kona mailing: reflects decisions made at the Kona meeting.
712 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>.
715 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>.
718 Post-Oxford mailing: reflects decisions made at the Oxford meeting.
719 All issues in Ready status were voted into DR status. All issues in
720 DR status were voted into WP status.
723 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>.
726 Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz
727 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
728 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-defects.html#387">387</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#389">389</a> were discussed
729 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
730 concerns with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#226">226</a> involve wording.
733 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-closed.html#382">382</a>.
734 Moved issues in the TC to TC status.
737 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>.
740 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>.
743 Post-Redmond mailing; reflects actions taken in Redmond. Added
744 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
745 <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
746 not discussed at the meeting.
748 All Ready issues were moved to DR status, with the exception of issues
749 <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>.
751 Noteworthy issues discussed at Redmond include
752 <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>,
753 <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>.
756 Pre-Redmond mailing. Added new issues
757 <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>.
760 Post-Copenhagen mailing; reflects actions taken in Copenhagen.
761 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
762 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>.
764 Changed status of issues
765 <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>
766 <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>
767 <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>
768 <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>
769 <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>
770 <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>
771 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#268">268</a>
774 Changed status of issues
775 <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>
776 <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>
777 <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>
778 <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>
779 <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>
780 <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>
781 <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>
782 <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>
783 <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>
787 <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>
788 <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>
789 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#314">314</a>
794 Pre-Copenhagen mailing. Converted issues list to XML. Added proposed
795 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>.
796 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>.
799 post-Toronto mailing; reflects actions taken in Toronto. Added new
800 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
801 <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>,
802 <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>,
803 <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>,
804 <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>,
805 <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>,
806 <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>,
807 <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>,
808 <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>,
809 <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>,
810 <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>,
811 <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>,
812 <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>,
813 <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-defects.html#23">23</a>. Reopened
814 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
815 <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
816 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
817 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
818 the bug in enough places.
821 pre-Toronto mailing. Added issues
822 <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
823 changes so that we pass Weblint tests.
826 post-Tokyo II mailing; reflects committee actions taken in
827 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)
830 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>.
833 pre-Tokyo II mailing: Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#199">199</a> to
834 <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
835 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#29">29</a>. Add further rationale to issue
836 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#178">178</a>.
839 post-Kona mailing: Updated to reflect LWG and full committee actions
840 in Kona (99-0048/N1224). Note changed resolution of issues
841 <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>
842 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
843 "closed" documents. Changed the proposed resolution of issue
844 <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
845 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#38">38</a>.
848 pre-Kona updated. Added proposed resolutions <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#83">83</a>,
849 <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>,
850 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#109">109</a>. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#190">190</a> to
851 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#195">195</a>. (99-0033/D1209, 14 Oct 99)
854 pre-Kona mailing. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#140">140</a> to
855 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#189">189</a>. Issues list split into separate "active" and
856 "closed" documents. (99-0030/N1206, 25 Aug 99)
859 post-Dublin mailing. Updated to reflect LWG and full committee actions
860 in Dublin. (99-0016/N1193, 21 Apr 99)
863 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>,
864 <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>,
865 <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>,
866 <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)
869 pre-Dublin mailing. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#127">127</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#128">128</a>,
870 and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#129">129</a>. (99-0007/N1194, 22 Feb 99)
873 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
874 <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
875 for making list public. (30 Dec 98)
878 post-Santa Cruz II updated: Issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#110">110</a>,
879 <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
880 issues corrected. (22 Oct 98)
883 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>
884 added, many issues updated to reflect LWG consensus (12 Oct 98)
887 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,
888 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#17">17</a> updated. (29 Sep 98)
891 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
892 format, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#64">64</a> title. (17 Sep 98)
896 <h2><a name="Status"></a>Issue Status</h2>
898 <p><b><a name="New">New</a></b> - The issue has not yet been
899 reviewed by the LWG. Any <b>Proposed Resolution</b> is purely a
900 suggestion from the issue submitter, and should not be construed as
903 <p><b><a name="Open">Open</a></b> - The LWG has discussed the issue
904 but is not yet ready to move the issue forward. There are several
905 possible reasons for open status:</p>
907 <li>Consensus may have not yet have been reached as to how to deal
909 <li>Informal consensus may have been reached, but the LWG awaits
910 exact <b>Proposed Resolution</b> wording for review.</li>
911 <li>The LWG wishes to consult additional technical experts before
913 <li>The issue may require further study.</li>
916 <p>A <b>Proposed Resolution</b> for an open issue is still not be
917 construed as the view of LWG. Comments on the current state of
918 discussions are often given at the end of open issues in an italic
919 font. Such comments are for information only and should not be given
920 undue importance.</p>
922 <p><b><a name="Dup">Dup</a></b> - The LWG has reached consensus that
923 the issue is a duplicate of another issue, and will not be further
924 dealt with. A <b>Rationale</b> identifies the duplicated issue's
927 <p><b><a name="NAD">NAD</a></b> - The LWG has reached consensus that
928 the issue is not a defect in the Standard.</p>
930 <p><b><a name="NAD Editorial">NAD Editorial</a></b> - The LWG has reached consensus that
931 the issue can either be handled editorially, or is handled by a paper (usually
932 linked to in the rationale).</p>
934 <p><b><a name="NAD Concepts">NAD Concepts</a></b> - The LWG has reached consensus that
935 the issue is NAD for now, but represents a real issue when the library is
936 done with language-supported concepts.</p>
938 <p><b><a name="NAD Future">NAD Future</a></b> - In addition to the regular
939 status, the LWG believes that this issue should be revisited at the
940 next revision of the standard.</p>
942 <p><b><a name="Review">Review</a></b> - Exact wording of a
943 <b>Proposed Resolution</b> is now available for review on an issue
944 for which the LWG previously reached informal consensus.</p>
946 <p><b><a name="Ready">Ready</a></b> - The LWG has reached consensus
947 that the issue is a defect in the Standard, the <b>Proposed
948 Resolution</b> is correct, and the issue is ready to forward to the
949 full committee for further action as a Defect Report (DR).</p>
951 <p><b><a name="DR">DR</a></b> - (Defect Report) - The full J16
952 committee has voted to forward the issue to the Project Editor to be
953 processed as a Potential Defect Report. The Project Editor reviews
954 the issue, and then forwards it to the WG21 Convenor, who returns it
955 to the full committee for final disposition. This issues list
956 accords the status of DR to all these Defect Reports regardless of
957 where they are in that process.</p>
959 <p><b><a name="TC1">TC1</a></b> - (Technical Corrigenda 1) - The full
960 WG21 committee has voted to accept the Defect Report's Proposed
961 Resolution as a Technical Corrigenda. Action on this issue is thus
962 complete and no further action is possible under ISO rules.</p>
964 <p><b><a name="CD1">CD1</a></b> - (Committee Draft 2008) - The full
965 WG21 committee has voted to accept the Defect Report's Proposed
966 Resolution into the Fall 2008 Committee Draft.</p>
968 <p><b><a name="TRDec">TRDec</a></b> - (Decimal TR defect) - The
969 LWG has voted to accept the Defect Report's Proposed
970 Resolution into the Decimal TR. Action on this issue is thus
971 complete and no further action is expected.</p>
973 <p><b><a name="WP">WP</a></b> - (Working Paper) - The proposed
974 resolution has not been accepted as a Technical Corrigendum, but
975 the full WG21 committee has voted to apply the Defect Report's Proposed
976 Resolution to the working paper.</p>
978 <p><b>Tentatively</b> - This is a <i>status qualifier</i>. The issue has
979 been reviewed online, or at an unofficial meeting, but not in an official meeting, and some support has been formed
980 for the qualified status. Tentatively qualified issues may be moved to the unqualified status
981 and forwarded to full committee (if Ready) within the same meeting. Unlike Ready issues, Tentatively Ready issues
982 will be reviewed in subcommittee prior to forwarding to full committee. When a status is
983 qualified with Tentatively, the issue is still considered active.</p>
985 <p><b>Pending</b> - This is a <i>status qualifier</i>. When prepended to
986 a status this indicates the issue has been
987 processed by the committee, and a decision has been made to move the issue to
988 the associated unqualified status. However for logistical reasons the indicated
989 outcome of the issue has not yet appeared in the latest working paper.
991 </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
992 they first appear on the issues list. They may progress to
993 <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
994 is actively working on them. When the LWG has reached consensus on
995 the disposition of an issue, the status will then change to
996 <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
997 <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
998 forward Ready issues to the Project Editor, they are given the
999 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
1000 become the basis for Technical Corrigenda (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>),
1001 or are closed without action other than a Record of Response
1002 (<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
1003 only issues which are truly defects in the Standard move to the
1004 formal ISO DR status.
1008 <h2>Active Issues</h2>
1010 <h3><a name="96"></a>96. Vector<bool> is not a container</h3>
1011 <p><b>Section:</b> 23.3.6 [vector] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1012 <b>Submitter:</b> AFNOR <b>Opened:</b> 1998-10-07 <b>Last modified:</b> 2009-07-29</p>
1013 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#vector">active issues</a> in [vector].</p>
1014 <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>
1015 <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>
1016 <p><b>Discussion:</b></p>
1017 <p><tt>vector<bool></tt> is not a container as its reference and
1018 pointer types are not references and pointers. </p>
1020 <p>Also it forces everyone to have a space optimization instead of a
1023 <p><b>See also:</b> 99-0008 == N1185 Vector<bool> is
1024 Nonconforming, Forces Optimization Choice.</p>
1026 <p><i>[In Santa Cruz the LWG felt that this was Not A Defect.]</i></p>
1029 <p><i>[In Dublin many present felt that failure to meet Container
1030 requirements was a defect. There was disagreement as to whether
1031 or not the optimization requirements constituted a defect.]</i></p>
1034 <p><i>[The LWG looked at the following resolutions in some detail:
1036 * Not A Defect.<br>
1037 * Add a note explaining that vector<bool> does not meet
1038 Container requirements.<br>
1039 * Remove vector<bool>.<br>
1040 * Add a new category of container requirements which
1041 vector<bool> would meet.<br>
1042 * Rename vector<bool>.<br>
1044 No alternative had strong, wide-spread, support and every alternative
1045 had at least one "over my dead body" response.<br>
1047 There was also mention of a transition scheme something like (1) add
1048 vector_bool and deprecate vector<bool> in the next standard. (2)
1049 Remove vector<bool> in the following standard.]</i></p>
1052 <p><i>[Modifying container requirements to permit returning proxies
1053 (thus allowing container requirements conforming vector<bool>)
1054 was also discussed.]</i></p>
1057 <p><i>[It was also noted that there is a partial but ugly workaround in
1058 that vector<bool> may be further specialized with a customer
1062 <p><i>[Kona: Herb Sutter presented his paper J16/99-0035==WG21/N1211,
1063 vector<bool>: More Problems, Better Solutions. Much discussion
1064 of a two step approach: a) deprecate, b) provide replacement under a
1065 new name. LWG straw vote on that: 1-favor, 11-could live with, 2-over
1066 my dead body. This resolution was mentioned in the LWG report to the
1067 full committee, where several additional committee members indicated
1068 over-my-dead-body positions.]</i></p>
1071 <p>Discussed at Lillehammer. General agreement that we should
1072 deprecate vector<bool> and introduce this functionality under
1073 a different name, e.g. bit_vector. This might make it possible to
1074 remove the vector<bool> specialization in the standard that comes
1075 after C++0x. There was also a suggestion that
1076 in C++0x we could additional say that it's implementation defined
1077 whether vector<bool> refers to the specialization or to the
1078 primary template, but there wasn't general agreement that this was a
1081 <p>We need a paper for the new bit_vector class.</p>
1088 The LWG feels we need something closer to SGI's <tt>bitvector</tt> to ease migration
1089 from <tt>vector<bool></tt>. Although some of the funcitonality from
1090 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2050.pdf">N2050</a>
1091 could well be used in such a template. The concern is easing the API migration for those
1092 users who want to continue using a bit-packed container. Alan and Beman to work.
1096 Post Summit Alisdair adds:
1102 <tt>vector<bool></tt> is now a conforming container under the revised terms of C++0x,
1103 which supports containers of proxies.
1112 i/ premature optimization in the specification.
1113 There is still some sentiment that deprecation is the correct way to go,
1114 although it is still not clear what it would mean to deprecate a single
1115 specialization of a template.
1118 Recommend: Create a new issue for the discussion, leave as Open.
1121 ii/ Request for a new bitvector class to guarantee the optimization, perhaps
1122 with a better tuned interface.
1125 This is a clear extension request that may be handled via a future TR.
1134 We note that most of this issue has become moot over time,
1135 and agree with Alisdair's recommendations.
1136 Move to NAD Future for reconsideration of part (ii).
1140 2009-07-29 Alisdair reopens:
1146 This infamous issue was closed as NAD Future when concepts introduced
1147 support for proxy iterators, so the only remaining requirement was to
1148 provide a better type to support bitsets of dynamic length. I fear we
1149 must re-open this issue until the post-concept form of iterators is
1150 available, and hopefully will support the necessary proxy functionality
1151 to allow us to close this issue as NAD.
1155 I recommend we spawn a separate issue (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1184">1184</a>) requesting a dynamic length bitset
1156 and pre-emptively file it as NAD Future. It is difficult to resolve #96
1157 when it effectively contains two separate sub-issues.
1162 <p><b>Proposed resolution:</b></p>
1165 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2050.pdf">N2050</a>
1167 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html">N2160</a>.
1176 <h3><a name="149"></a>149. Insert should return iterator to first element inserted</h3>
1177 <p><b>Section:</b> 23.2.3 [sequence.reqmts] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
1178 <b>Submitter:</b> Andrew Koenig <b>Opened:</b> 1999-06-28 <b>Last modified:</b> 2009-07-15</p>
1179 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#sequence.reqmts">issues</a> in [sequence.reqmts].</p>
1180 <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>
1181 <p><b>Discussion:</b></p>
1182 <p>Suppose that c and c1 are sequential containers and i is an
1183 iterator that refers to an element of c. Then I can insert a copy of
1184 c1's elements into c ahead of element i by executing </p>
1188 <pre>c.insert(i, c1.begin(), c1.end());</pre>
1192 <p>If c is a vector, it is fairly easy for me to find out where the
1193 newly inserted elements are, even though i is now invalid: </p>
1197 <pre>size_t i_loc = i - c.begin();
1198 c.insert(i, c1.begin(), c1.end());</pre>
1202 <p>and now the first inserted element is at c.begin()+i_loc and one
1203 past the last is at c.begin()+i_loc+c1.size().<br>
1205 But what if c is a list? I can still find the location of one past the
1206 last inserted element, because i is still valid. To find the location
1207 of the first inserted element, though, I must execute something like </p>
1211 <pre>for (size_t n = c1.size(); n; --n)
1216 <p>because i is now no longer a random-access iterator.<br>
1218 Alternatively, I might write something like </p>
1222 <pre>bool first = i == c.begin();
1223 list<T>::iterator j = i;
1225 c.insert(i, c1.begin(), c1.end());
1233 <p>which, although wretched, requires less overhead.<br>
1235 But I think the right solution is to change the definition of insert
1236 so that instead of returning void, it returns an iterator that refers
1237 to the first element inserted, if any, and otherwise is a copy of its
1238 first argument. </p>
1246 Reopened by Alisdair.
1250 Post Summit Alisdair adds:
1256 In addition to the original rationale for C++03, this change also gives a
1257 consistent interface for all container insert operations i.e. they all
1258 return an iterator to the (first) inserted item.
1262 Proposed wording provided.
1273 Q: why isn't this change also proposed for associative containers?
1277 A: The returned iterator wouldn't necessarily point to a contiguous range.
1287 <p><b>Proposed resolution:</b></p>
1289 <sef ref="[sequence.reqmts]"> Table 83
1290 change return type from <tt>void</tt> to <tt>iterator</tt> for the following rows:
1295 <caption>Table 83 -- Sequence container requirements (in addition to container)</caption>
1298 <th>Return type</th>
1299 <th>Assertion/note pre-/post-condition</th>
1303 <tt>a.insert(p,n,t)</tt>
1306 <tt><del>void</del> <ins>iterator</ins></tt>
1309 Inserts <tt>n</tt> copies of <tt>t</tt> before <tt>p</tt>.
1315 <tt>a.insert(p,i,j)</tt>
1318 <tt><del>void</del> <ins>iterator</ins></tt>
1321 Each iterator in the range <tt>[i,j)</tt> shall be
1322 dereferenced exactly once.
1323 pre: <tt>i</tt> and <tt>j</tt> are not iterators into <tt>a</tt>.
1324 Inserts copies of elements in <tt>[i, j)</tt> before <tt>p</tt>
1330 <tt>a.insert(p,il)</tt>
1333 <tt><del>void</del> <ins>iterator</ins></tt>
1336 <tt>a.insert(p, il.begin(), il.end())</tt>.
1343 Add after p6 23.2.3 [sequence.reqmts]:
1350 The iterator returned from <tt>a.insert(p,n,t)</tt> points to the copy of the
1351 first element inserted into <tt>a</tt>, or <tt>p</tt> if <tt>n == 0</tt>.
1355 The iterator returned from <tt>a.insert(p,i,j)</tt> points to the copy of the
1356 first element inserted into <tt>a</tt>, or <tt>p</tt> if <tt>i == j</tt>.
1360 The iterator returned from <tt>a.insert(p,il)</tt> points to the copy of the
1361 first element inserted into <tt>a</tt>, or <tt>p</tt> if <tt>il</tt> is empty.
1367 p2 23.3.2 [deque] Update class definition, change return type
1368 from <tt>void</tt> to <tt>iterator</tt>:
1371 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator position, size_type n, const T& x);
1372 template <class InputIterator>
1373 <del>void</del> <ins>iterator</ins> insert(const_iterator position, InputIterator first, InputIterator last);
1374 <del>void</del> <ins>iterator</ins> insert(const_iterator position, initializer_list<T>);
1378 23.3.2.3 [deque.modifiers] change return type from <tt>void</tt> to <tt>iterator</tt> on following declarations:
1381 <blockquote><pre> <del>void</del> <ins>iterator</ins> insert(const_iterator position, size_type n, const T& x);
1382 template <class InputIterator>
1383 <del>void</del> <ins>iterator</ins> insert(const_iterator position, InputIterator first, InputIterator last);
1387 Add the following (missing) declaration
1390 <blockquote><pre><ins>iterator insert(const_iterator position, initializer_list<T>);</ins>
1394 23.3.3 [forwardlist] Update class definition, change return type
1395 from <tt>void</tt> to <tt>iterator</tt>:
1398 <blockquote><pre><del>void</del> <ins>iterator</ins> insert_after(const_iterator position, initializer_list<T> il);
1399 <del>void</del> <ins>iterator</ins> insert_after(const_iterator position, size_type n, const T& x);
1400 template <class InputIterator>
1401 <del>void</del> <ins>iterator</ins> insert_after(const_iterator position, InputIterator first, InputIterator last);
1405 p8 23.3.3.4 [forwardlist.modifiers] change return type from <tt>void</tt> to <tt>iterator</tt>:
1408 <blockquote><pre><del>void</del> <ins>iterator</ins> insert_after(const_iterator position, size_type n, const T& x);
1420 p10 23.3.3.4 [forwardlist.modifiers] change return type from <tt>void</tt> to <tt>iterator</tt>:
1423 <blockquote><pre>template <class InputIterator>
1424 <del>void</del> <ins>iterator</ins> insert_after(const_iterator position, InputIterator first, InputIterator last);
1436 p12 23.3.3.4 [forwardlist.modifiers] change return type from <tt>void</tt> to <tt>iterator</tt> on following declarations:
1439 <blockquote><pre><del>void</del> <ins>iterator</ins> insert_after(const_iterator position, initializer_list<T> il);
1443 change return type from <tt>void</tt> to <tt>iterator</tt> on following declarations:
1447 p2 23.3.4 [list] Update class definition, change return type from <tt>void</tt> to <tt>iterator</tt>:
1450 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator position, size_type n, const T& x);
1452 template <class InputIterator>
1453 <del>void</del> <ins>iterator</ins> insert(const_iterator position, InputIterator first, InputIterator last);
1455 <del>void</del> <ins>iterator</ins> insert(const_iterator position, initializer_list<T>);
1459 23.3.4.3 [list.modifiers] change return type from <tt>void</tt> to <tt>iterator</tt> on following declarations:
1462 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator position, size_type n, const T& x);
1464 template <class InputIterator>
1465 <del>void</del> <ins>iterator</ins> insert(const_iterator position, InputIterator first, InputIterator last);
1469 Add the following (missing) declaration
1472 <blockquote><pre>iterator insert(const_iterator position, initializer_list<T>);
1480 Update class definition, change return type from <tt>void</tt> to <tt>iterator</tt>:
1483 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator position, T&& x);
1485 <del>void</del> <ins>iterator</ins> insert(const_iterator position, size_type n, const T& x);
1487 template <class InputIterator>
1488 <del>void</del> <ins>iterator</ins> insert(const_iterator position, InputIterator first, InputIterator last);
1490 <del>void</del> <ins>iterator</ins> insert(const_iterator position, initializer_list<T>);
1494 23.3.6.4 [vector.modifiers] change return type from <tt>void</tt> to <tt>iterator</tt> on following declarations:
1497 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator position, size_type n, const T& x);
1499 template <class InputIterator>
1500 <del>void</del> <ins>iterator</ins> insert(const_iterator position, InputIterator first, InputIterator last);
1504 Add the following (missing) declaration
1507 <blockquote><pre>iterator insert(const_iterator position, initializer_list<T>);
1512 p1 23.3.7 [vector.bool] Update class definition, change return type from <tt>void</tt> to <tt>iterator</tt>:
1515 <blockquote><pre><del>void</del> <ins>iterator</ins> insert (const_iterator position, size_type n, const bool& x);
1517 template <class InputIterator>
1518 <del>void</del> <ins>iterator</ins> insert(const_iterator position, InputIterator first, InputIterator last);
1520 <del>void</del> <ins>iterator</ins> insert(const_iterator position, initializer_list<bool> il);
1524 p5 21.4 [basic.string] Update class definition, change return type from <tt>void</tt> to <tt>iterator</tt>:
1527 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator p, size_type n, charT c);
1529 template<class InputIterator>
1530 <del>void</del> <ins>iterator</ins> insert(const_iterator p, InputIterator first, InputIterator last);
1532 <del>void</del> <ins>iterator</ins> insert(const_iterator p, initializer_list<charT>);
1536 p13 21.4.6.4 [string::insert] change return type from <tt>void</tt> to <tt>iterator</tt>:
1539 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator p, size_type n, charT c);
1547 <i>Returns:</i> an iterator which refers to the copy of the first inserted
1548 character, or <tt>p</tt> if <tt>n == 0</tt>.
1552 p15 21.4.6.4 [string::insert] change return type from <tt>void</tt> to <tt>iterator</tt>:
1555 <blockquote><pre>template<class InputIterator>
1556 <del>void</del> <ins>iterator</ins> insert(const_iterator p, InputIterator first, InputIterator last);
1564 <i>Returns:</i> an iterator which refers to the copy of the first inserted
1565 character, or <tt>p</tt> if <tt>first == last</tt>.
1569 p17 21.4.6.4 [string::insert] change return type from <tt>void</tt> to <tt>iterator</tt>:
1572 <blockquote><pre><del>void</del> <ins>iterator</ins> insert(const_iterator p, initializer_list<charT> il);
1580 <i>Returns:</i> an iterator which refers to the copy of the first inserted
1581 character, or <tt>p</tt> if <tt>il</tt> is empty.
1586 <p><b>Rationale:</b></p>
1589 The following was the C++98/03 rationale and does not necessarily apply to the
1590 proposed resolution in the C++0X time frame:
1595 <p>The LWG believes this was an intentional design decision and so is
1596 not a defect. It may be worth revisiting for the next standard.</p>
1603 <h3><a name="299"></a>299. Incorrect return types for iterator dereference</h3>
1604 <p><b>Section:</b> 24.2.5 [bidirectional.iterators], 24.2.6 [random.access.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
1605 <b>Submitter:</b> John Potter <b>Opened:</b> 2001-01-22 <b>Last modified:</b> 2009-07-28</p>
1606 <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>
1607 <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>
1608 <p><b>Discussion:</b></p>
1610 In section 24.2.5 [bidirectional.iterators],
1611 Table 75 gives the return type of *r-- as convertible to T. This is
1612 not consistent with Table 74 which gives the return type of *r++ as
1613 T&. *r++ = t is valid while *r-- = t is invalid.
1617 In section 24.2.6 [random.access.iterators],
1618 Table 76 gives the return type of a[n] as convertible to T. This is
1619 not consistent with the semantics of *(a + n) which returns T& by
1620 Table 74. *(a + n) = t is valid while a[n] = t is invalid.
1624 Discussion from the Copenhagen meeting: the first part is
1625 uncontroversial. The second part, operator[] for Random Access
1626 Iterators, requires more thought. There are reasonable arguments on
1627 both sides. Return by value from operator[] enables some potentially
1628 useful iterators, e.g. a random access "iota iterator" (a.k.a
1629 "counting iterator" or "int iterator"). There isn't any obvious way
1630 to do this with return-by-reference, since the reference would be to a
1631 temporary. On the other hand, <tt>reverse_iterator</tt> takes an
1632 arbitrary Random Access Iterator as template argument, and its
1633 operator[] returns by reference. If we decided that the return type
1634 in Table 76 was correct, we would have to change
1635 <tt>reverse_iterator</tt>. This change would probably affect user
1640 History: the contradiction between <tt>reverse_iterator</tt> and the
1641 Random Access Iterator requirements has been present from an early
1642 stage. In both the STL proposal adopted by the committee
1643 (N0527==94-0140) and the STL technical report (HPL-95-11 (R.1), by
1644 Stepanov and Lee), the Random Access Iterator requirements say that
1645 operator[]'s return value is "convertible to T". In N0527
1646 reverse_iterator's operator[] returns by value, but in HPL-95-11
1647 (R.1), and in the STL implementation that HP released to the public,
1648 reverse_iterator's operator[] returns by reference. In 1995, the
1649 standard was amended to reflect the contents of HPL-95-11 (R.1). The
1650 original intent for operator[] is unclear.
1654 In the long term it may be desirable to add more fine-grained
1655 iterator requirements, so that access method and traversal strategy
1656 can be decoupled. (See "Improved Iterator Categories and
1657 Requirements", N1297 = 01-0011, by Jeremy Siek.) Any decisions
1658 about issue 299 should keep this possibility in mind.
1661 <p>Further discussion: I propose a compromise between John Potter's
1662 resolution, which requires <tt>T&</tt> as the return type of
1663 <tt>a[n]</tt>, and the current wording, which requires convertible to
1664 <tt>T</tt>. The compromise is to keep the convertible to <tt>T</tt>
1665 for the return type of the expression <tt>a[n]</tt>, but to also add
1666 <tt>a[n] = t</tt> as a valid expression. This compromise "saves" the
1667 common case uses of random access iterators, while at the same time
1668 allowing iterators such as counting iterator and caching file
1669 iterators to remain random access iterators (iterators where the
1670 lifetime of the object returned by <tt>operator*()</tt> is tied to the
1671 lifetime of the iterator).
1675 Note that the compromise resolution necessitates a change to
1676 <tt>reverse_iterator</tt>. It would need to use a proxy to support
1681 Note also there is one kind of mutable random access iterator that
1682 will no longer meet the new requirements. Currently, iterators that
1683 return an r-value from <tt>operator[]</tt> meet the requirements for a
1684 mutable random access iterartor, even though the expression <tt>a[n] =
1685 t</tt> will only modify a temporary that goes away. With this proposed
1686 resolution, <tt>a[n] = t</tt> will be required to have the same
1687 operational semantics as <tt>*(a + n) = t</tt>.
1691 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
1697 <p><b>Proposed resolution:</b></p>
1700 In section 24.1.4 [lib.bidirectdional.iterators], change the return
1701 type in table 75 from "convertible to <tt>T</tt>" to
1706 In section 24.1.5 [lib.random.access.iterators], change the
1707 operational semantics for <tt>a[n]</tt> to " the r-value of
1708 <tt>a[n]</tt> is equivalent to the r-value of <tt>*(a +
1709 n)</tt>". Add a new row in the table for the expression <tt>a[n] = t</tt>
1710 with a return type of convertible to <tt>T</tt> and operational semantics of
1711 <tt>*(a + n) = t</tt>.
1714 <p><i>[Lillehammer: Real problem, but should be addressed as part of
1715 iterator redesign]</i></p>
1720 <p><b>Rationale:</b></p>
1728 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/N2758.pdf">N2758</a>.
1738 <h3><a name="397"></a>397. ostream::sentry dtor throws exceptions</h3>
1739 <p><b>Section:</b> 27.7.2.4 [ostream::sentry] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
1740 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2003-01-05 <b>Last modified:</b> 2009-07-14</p>
1741 <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>
1742 <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>
1743 <p><b>Discussion:</b></p>
1745 17.4.4.8, p3 prohibits library dtors from throwing exceptions.
1748 27.6.2.3, p4 says this about the ostream::sentry dtor:
1750 <pre> -4- If ((os.flags() & ios_base::unitbuf) && !uncaught_exception())
1751 is true, calls os.flush().
1754 27.6.2.6, p7 that describes ostream::flush() says:
1756 <pre> -7- If rdbuf() is not a null pointer, calls rdbuf()->pubsync().
1757 If that function returns ?-1 calls setstate(badbit) (which
1758 may throw ios_base::failure (27.4.4.3)).
1761 That seems like a defect, since both pubsync() and setstate() can
1765 The contradiction is real. Clause 17 says destructors may never
1766 throw exceptions, and clause 27 specifies a destructor that does
1767 throw. In principle we might change either one. We're leaning
1768 toward changing clause 17: putting in an "unless otherwise specified"
1769 clause, and then putting in a footnote saying the sentry destructor
1770 is the only one that can throw. PJP suggests specifying that
1771 sentry::~sentry() should internally catch any exceptions it might cause.
1776 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.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.
1787 Move to Review. Add "Throws: nothing" to the specification of ostream::sentry::~sentry().
1793 <p><b>Proposed resolution:</b></p>
1795 Add after 27.7.2.4 [ostream::sentry] p17:
1803 -17- If <tt>((os.flags() & ios_base::unitbuf) && !uncaught_exception())</tt>
1804 is <tt>true</tt>, calls <tt>os.flush()</tt>.
1808 <i>Throws:</i> Nothing.
1818 <h3><a name="408"></a>408. Is vector<reverse_iterator<char*> > forbidden?</h3>
1819 <p><b>Section:</b> 24.2 [iterator.concepts] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
1820 <b>Submitter:</b> Nathan Myers <b>Opened:</b> 2003-06-03 <b>Last modified:</b> 2009-07-31</p>
1821 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#iterator.concepts">active issues</a> in [iterator.concepts].</p>
1822 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iterator.concepts">issues</a> in [iterator.concepts].</p>
1823 <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>
1824 <p><b>Discussion:</b></p>
1826 I've been discussing iterator semantics with Dave Abrahams, and a
1827 surprise has popped up. I don't think this has been discussed before.
1831 24.2 [iterator.concepts] says that the only operation that can be performed on "singular"
1832 iterator values is to assign a non-singular value to them. (It
1833 doesn't say they can be destroyed, and that's probably a defect.)
1834 Some implementations have taken this to imply that there is no need
1835 to initialize the data member of a reverse_iterator<> in the default
1836 constructor. As a result, code like
1838 <blockquote><pre> std::vector<std::reverse_iterator<char*> > v(7);
1842 invokes undefined behavior, because it must default-initialize the
1843 vector elements, and then copy them to other storage. Of course many
1844 other vector operations on these adapters are also left undefined,
1845 and which those are is not reliably deducible from the standard.
1849 I don't think that 24.1 was meant to make standard-library iterator
1850 types unsafe. Rather, it was meant to restrict what operations may
1851 be performed by functions which take general user- and standard
1852 iterators as arguments, so that raw pointers would qualify as
1853 iterators. However, this is not clear in the text, others have come
1854 to the opposite conclusion.
1858 One question is whether the standard iterator adaptors have defined
1859 copy semantics. Another is whether they have defined destructor
1862 <blockquote><pre> { std::vector<std::reverse_iterator<char*> > v(7); }
1869 Note this is not a question of whether algorithms are allowed to
1870 rely on copy semantics for arbitrary iterators, just whether the
1871 types we actually supply support those operations. I believe the
1872 resolution must be expressed in terms of the semantics of the
1873 adapter's argument type. It should make clear that, e.g., the
1874 reverse_iterator<T> constructor is actually required to execute
1875 T(), and so copying is defined if the result of T() is copyable.
1879 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#235">235</a>, which defines reverse_iterator's default
1880 constructor more precisely, has some relevance to this issue.
1881 However, it is not the whole story.
1885 The issue was whether
1887 <blockquote><pre> reverse_iterator() { }
1892 <blockquote><pre> reverse_iterator() : current() { }
1896 The difference is when T is char*, where the first leaves the member
1897 uninitialized, and possibly equal to an existing pointer value, or
1898 (on some targets) may result in a hardware trap when copied.
1902 8.5 paragraph 5 seems to make clear that the second is required to
1903 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
1908 But that only takes care of reverse_iterator, and doesn't establish
1909 a policy for all iterators. (The reverse iterator adapter was just
1910 an example.) In particular, does my function
1912 <blockquote><pre> template <typename Iterator>
1913 void f() { std::vector<Iterator> v(7); }
1916 evoke undefined behavior for some conforming iterator definitions?
1917 I think it does, now, because vector<> will destroy those singular
1918 iterator values, and that's explicitly disallowed.
1922 24.1 shouldn't give blanket permission to copy all singular iterators,
1923 because then pointers wouldn't qualify as iterators. However, it
1924 should allow copying of that subset of singular iterator values that
1925 are default-initialized, and it should explicitly allow destroying any
1926 iterator value, singular or not, default-initialized or not.
1929 <p>Related issues: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#407">407</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a></p>
1931 We don't want to require all singular iterators to be copyable,
1932 because that is not the case for pointers. However, default
1933 construction may be a special case. Issue: is it really default
1934 construction we want to talk about, or is it something like value
1935 initialization? We need to check with core to see whether default
1936 constructed pointers are required to be copyable; if not, it would be
1937 wrong to impose so strict a requirement for iterators.
1942 2009-05-10 Alisdair provided wording.
1947 The comments regarding destroying singular iterators have already been
1948 resolved. That just leaves copying (with moving implied).
1958 This is related to LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a>.
1961 Note that there is a bug in the proposed resolution to LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a>. The
1962 change to [reverse.iter.con] should be modified so that the word
1963 "default" in the second sentence of the Effects clause is replaced by
1967 We believe that the proposed fix to LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a> (now corrected) is
1968 sufficient to solve the problem for reverse_iterator. However, Alisdair
1969 pointed out that LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a> does not solve the general problem for authors
1970 of iterator adaptors.
1973 There are some problems with the proposed resolution. The phrase "safely
1974 copyable" is not a term of art. Also, it mentions a
1975 DefaultConstructible? concept.
1978 Move to Review after Alisdair updates the wording.
1983 2009-07-31 Alisdair revised wording:
1989 <p><b>Proposed resolution:</b></p>
1991 Add a new paragrpah to Iterator concepts 24.2 [iterator.concepts] after para 5 (the one
1992 describing singular iterators)
1996 Just as a regular pointer to an array guarantees that there is a pointer
1997 value pointing past the last element of the array, so for any iterator
1998 type there is an iterator value that points past the last element of a
1999 corresponding container. These values are called <i>past-the-end</i> values.
2000 Values of an iterator <tt>i</tt> for which the expression <tt>*i</tt> is defined are called
2001 <i>dereferenceable</i>. The library never assumes that past-the-end values are
2002 dereferenceable. Iterators can also have singular values that are not
2003 associated with any container. [<i>Example:</i> After the declaration of an
2004 uninitialized pointer <tt>x</tt> (as with <tt>int* x;</tt>), <tt>x</tt> must always be assumed to
2005 have a singular value of a pointer. — <i>end example</i>] Results of most
2006 expressions are undefined for singular values; the only exceptions are
2007 destroying an iterator that holds a singular value and the assignment of
2008 a non-singular value to an iterator that holds a singular value. In this
2009 case the singular value is overwritten the same way as any other value.
2010 Dereferenceable values are always non-singular.
2013 After value-initialization, any iterator that satisfies the
2014 <tt>DefaultConstructible</tt> concept shall not introduce undefined behaviour
2015 when used the source of a copy or move operation, even if it would
2016 otherwise be singular. [<i>Note:</i> This guarantee is not offered for
2017 default-initialization (8.5 [dcl.init]), although the distinction only
2018 matters for types with trivial default constructors such as pointers. —
2031 <h3><a name="419"></a>419. istream extractors not setting failbit if eofbit is already set</h3>
2032 <p><b>Section:</b> 27.7.1.1.3 [istream::sentry] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
2033 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2003-09-18 <b>Last modified:</b> 2009-07-14</p>
2034 <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>
2035 <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>
2036 <p><b>Discussion:</b></p>
2039 27.7.1.1.3 [istream::sentry], p2 says that istream::sentry ctor prepares for input if is.good()
2040 is true. p4 then goes on to say that the ctor sets the sentry::ok_ member to
2041 true if the stream state is good after any preparation. 27.7.1.2.1 [istream.formatted.reqmts], p1 then
2042 says that a formatted input function endeavors to obtain the requested input
2043 if the sentry's operator bool() returns true.
2045 Given these requirements, no formatted extractor should ever set failbit if
2046 the initial stream rdstate() == eofbit. That is contrary to the behavior of
2047 all implementations I tested. The program below prints out
2055 #include <sstream>
2056 #include <cstdio>
2060 std::istringstream strm ("1");
2066 std::printf ("eof = %d, fail = %d\n",
2067 !!strm.eof (), !!strm.fail ());
2071 std::printf ("eof = %d, fail = %d\n",
2072 !!strm.eof (), !!strm.fail ());
2079 Comments from Jerry Schwarz (c++std-lib-11373):
2082 Jerry Schwarz wrote:
2085 I don't know where (if anywhere) it says it in the standard, but the
2086 formatted extractors are supposed to set failbit if they don't extract
2087 any characters. If they didn't then simple loops like
2090 while (cin >> x);
2096 Further comments from Martin Sebor:
2099 The question is which part of the extraction should prevent this from happening
2100 by setting failbit when eofbit is already set. It could either be the sentry
2101 object or the extractor. It seems that most implementations have chosen to
2102 set failbit in the sentry [...] so that's the text that will need to be
2107 Pre Berlin: This issue is related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#342">342</a>. If the sentry
2108 sets <tt>failbit</tt> when it finds <tt>eofbit</tt> already set, then
2109 you can never seek away from the end of stream.
2111 <p>Kona: Possibly NAD. If eofbit is set then good() will return false. We
2112 then set <i>ok</i> to false. We believe that the sentry's
2113 constructor should always set failbit when <i>ok</i> is false, and
2114 we also think the standard already says that. Possibly it could be
2129 <p><b>Proposed resolution:</b></p>
2131 Change 27.7.1.1.3 [istream::sentry], p2 to:
2135 <pre>explicit sentry(basic_istream<charT,traits>& <i>is</i> , bool <i>noskipws</i> = false);</pre>
2137 -2- <i>Effects:</i> If <tt>is.good()</tt> is <del><tt>true</tt></del>
2138 <ins><tt>false</tt></ins>, <ins>calls <tt>is.setstate(failbit)</tt>.
2139 Otherwise</ins> prepares for formatted or unformatted input. ...
2149 <h3><a name="427"></a>427. stage 2 and rationale of DR 221</h3>
2150 <p><b>Section:</b> 22.4.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>
2151 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2003-09-18 <b>Last modified:</b> 2009-07-14</p>
2152 <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>
2153 <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>
2154 <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>
2155 <p><b>Discussion:</b></p>
2157 The requirements specified in Stage 2 and reiterated in the rationale
2158 of DR 221 (and echoed again in DR 303) specify that num_get<charT>::
2159 do_get() compares characters on the stream against the widened elements
2160 of "012...abc...ABCX+-"
2164 An implementation is required to allow programs to instantiate the num_get
2165 template on any charT that satisfies the requirements on a user-defined
2166 character type. These requirements do not include the ability of the
2167 character type to be equality comparable (the char_traits template must
2168 be used to perform tests for equality). Hence, the num_get template cannot
2169 be implemented to support any arbitrary character type. The num_get template
2170 must either make the assumption that the character type is equality-comparable
2171 (as some popular implementations do), or it may use char_traits<charT> to do
2172 the comparisons (some other popular implementations do that). This diversity
2173 of approaches makes it difficult to write portable programs that attempt to
2174 instantiate the num_get template on user-defined types.
2177 <p><i>[Kona: the heart of the problem is that we're theoretically
2178 supposed to use traits classes for all fundamental character
2179 operations like assignment and comparison, but facets don't have
2180 traits parameters. This is a fundamental design flaw and it
2181 appears all over the place, not just in this one place. It's not
2182 clear what the correct solution is, but a thorough review of facets
2183 and traits is in order. The LWG considered and rejected the
2184 possibility of changing numeric facets to use narrowing instead of
2185 widening. This may be a good idea for other reasons (see issue
2186 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#459">459</a>), but it doesn't solve the problem raised by this
2187 issue. Whether we use widen or narrow the <tt>num_get</tt> facet
2188 still has no idea which traits class the user wants to use for
2189 the comparison, because only streams, not facets, are passed traits
2190 classes. The standard does not require that two different
2191 traits classes with the same <tt>char_type</tt> must necessarily
2192 have the same behavior.]</i></p>
2195 <p>Informally, one possibility: require that some of the basic
2196 character operations, such as <tt>eq</tt>, <tt>lt</tt>,
2197 and <tt>assign</tt>, must behave the same way for all traits classes
2198 with the same <tt>char_type</tt>. If we accept that limitation on
2199 traits classes, then the facet could reasonably be required to
2200 use <tt>char_traits<charT></tt>.</p>
2209 There was general agreement that the standard only needs to specify the
2210 behavior when the character type is char or wchar_t.
2213 Beman: we don't need to worry about C++1x because there is a non-zero
2214 possibility that we would have a replacement facility for iostreams that
2215 would solve these problems.
2218 We need to change the following sentence in [locale.category], paragraph
2219 6 to specify that C is char and wchar_t:
2222 "A template formal parameter with name C represents the set of all
2223 possible specializations on a parameter that satisfies the requirements
2224 for a character on which any member of the iostream components can be
2228 We also need to specify in 27 that the basic character operations, such
2229 as eq, lt, and assign use std::char_traits.
2232 Daniel volunteered to provide wording.
2238 <p><b>Proposed resolution:</b></p>
2244 <h3><a name="430"></a>430. valarray subset operations</h3>
2245 <p><b>Section:</b> 26.6.2.4 [valarray.sub] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
2246 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2003-09-18 <b>Last modified:</b> 2009-07-14</p>
2247 <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>
2248 <p><b>Discussion:</b></p>
2250 The standard fails to specify the behavior of valarray::operator[](slice)
2251 and other valarray subset operations when they are passed an "invalid"
2252 slice object, i.e., either a slice that doesn't make sense at all (e.g.,
2253 slice (0, 1, 0) or one that doesn't specify a valid subset of the valarray
2254 object (e.g., slice (2, 1, 1) for a valarray of size 1).
2256 <p><i>[Kona: the LWG believes that invalid slices should invoke
2257 undefined behavior. Valarrays are supposed to be designed for high
2258 performance, so we don't want to require specific checking. We
2259 need wording to express this decision.]</i></p>
2268 Please note that the standard also fails to specify the behavior of
2269 slice_array and gslice_array in the valid case. Bill Plauger will
2270 endeavor to provide revised wording for slice_array and gslice_array.
2274 post-Bellevue: Bill provided wording.
2291 <p><b>Proposed resolution:</b></p>
2293 Insert after 26.6.2.4 [valarray.sub], paragraph 1:
2298 The member operator is overloaded to provide several ways to select
2300 of elements from among those controlled by <tt>*this</tt>. The first group of five
2301 member operators work in conjunction with various overloads of <tt>operator=</tt>
2302 (and other assigning operators) to allow selective replacement (slicing) of
2303 the controlled sequence. The selected elements must exist.
2306 The first member operator selects element off. For example:
2309 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2311 // v0 == valarray<char>("abcAefghijklmnop", 16)
2315 The second member operator selects those elements of the controlled sequence
2316 designated by <tt>slicearr</tt>. For example:
2319 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2320 valarray<char> v1("ABCDE", 5);
2321 v0[slice(2, 5, 3)] = v1;
2322 // v0 == valarray<char>("abAdeBghCjkDmnEp", 16)
2326 The third member operator selects those elements of the controlled sequence
2327 designated by <tt>gslicearr</tt>. For example:
2330 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2331 valarray<char> v1("ABCDEF", 6);
2332 const size_t lv[] = {2, 3};
2333 const size_t dv[] = {7, 2};
2334 const valarray<size_t> len(lv, 2), str(dv, 2);
2335 v0[gslice(3, len, str)] = v1;
2336 // v0 == valarray<char>("abcAeBgCijDlEnFp", 16)
2340 The fourth member operator selects those elements of the controlled sequence
2341 designated by <tt>boolarr</tt>. For example:
2344 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2345 valarray<char> v1("ABC", 3);
2346 const bool vb[] = {false, false, true, true, false, true};
2347 v0[valarray<bool>(vb, 6)] = v1;
2348 // v0 == valarray<char>("abABeCghijklmnop", 16)
2352 The fifth member operator selects those elements of the controlled sequence
2353 designated by indarr. For example:
2356 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2357 valarray<char> v1("ABCDE", 5);
2358 const size_t vi[] = {7, 5, 2, 3, 8};
2359 v0[valarray<size_t>(vi, 5)] = v1;
2360 // v0 == valarray<char>("abCDeBgAEjklmnop", 16)
2364 The second group of five member operators each construct an object that
2365 represents the value(s) selected. The selected elements must exist.
2369 The sixth member operator returns the value of element off. For example:
2372 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2373 // v0[3] returns 'd'
2377 The seventh member operator returns an object of class <tt>valarray<Ty></tt>
2378 containing those elements of the controlled sequence designated by <tt>slicearr</tt>.
2382 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2383 // v0[slice(2, 5, 3)] returns valarray<char>("cfilo", 5)
2387 The eighth member operator selects those elements of the controlled sequence
2388 designated by <tt>gslicearr</tt>. For example:
2391 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2392 const size_t lv[] = {2, 3};
2393 const size_t dv[] = {7, 2};
2394 const valarray<size_t> len(lv, 2), str(dv, 2);
2395 // v0[gslice(3, len, str)] returns
2396 // valarray<char>("dfhkmo", 6)
2400 The ninth member operator selects those elements of the controlled sequence
2401 designated by <tt>boolarr</tt>. For example:
2404 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2405 const bool vb[] = {false, false, true, true, false, true};
2406 // v0[valarray<bool>(vb, 6)] returns
2407 // valarray<char>("cdf", 3)
2411 The last member operator selects those elements of the controlled sequence
2412 designated by <tt>indarr</tt>. For example:
2415 <blockquote><pre>valarray<char> v0("abcdefghijklmnop", 16);
2416 const size_t vi[] = {7, 5, 2, 3, 8};
2417 // v0[valarray<size_t>(vi, 5)] returns
2418 // valarray<char>("hfcdi", 5)
2428 <h3><a name="431"></a>431. Swapping containers with unequal allocators</h3>
2429 <p><b>Section:</b> X [allocator.requirements], 25 [algorithms] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2430 <b>Submitter:</b> Matt Austern <b>Opened:</b> 2003-09-20 <b>Last modified:</b> 2009-07-17</p>
2431 <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>
2432 <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>
2433 <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>
2434 <p><b>Discussion:</b></p>
2435 <p>Clause X [allocator.requirements] paragraph 4 says that implementations
2436 are permitted to supply containers that are unable to cope with
2437 allocator instances and that container implementations may assume
2438 that all instances of an allocator type compare equal. We gave
2439 implementers this latitude as a temporary hack, and eventually we
2440 want to get rid of it. What happens when we're dealing with
2441 allocators that <i>don't</i> compare equal?
2444 <p>In particular: suppose that <tt>v1</tt> and <tt>v2</tt> are both
2445 objects of type <tt>vector<int, my_alloc></tt> and that
2446 <tt>v1.get_allocator() != v2.get_allocator()</tt>. What happens if
2447 we write <tt>v1.swap(v2)</tt>? Informally, three possibilities:</p>
2449 <p>1. This operation is illegal. Perhaps we could say that an
2450 implementation is required to check and to throw an exception, or
2451 perhaps we could say it's undefined behavior.</p>
2452 <p>2. The operation performs a slow swap (i.e. using three
2453 invocations of <tt>operator=</tt>, leaving each allocator with its
2454 original container. This would be an O(N) operation.</p>
2455 <p>3. The operation swaps both the vectors' contents and their
2456 allocators. This would be an O(1) operation. That is:</p>
2458 <pre> my_alloc a1(...);
2462 vector<int, my_alloc> v1(a1);
2463 vector<int, my_alloc> v2(a2);
2464 assert(a1 == v1.get_allocator());
2465 assert(a2 == v2.get_allocator());
2468 assert(a1 == v2.get_allocator());
2469 assert(a2 == v1.get_allocator());
2473 <p><i>[Kona: This is part of a general problem. We need a paper
2474 saying how to deal with unequal allocators in general.]</i></p>
2477 <p><i>[pre-Sydney: Howard argues for option 3 in
2478 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1599.html">N1599</a>.
2483 2007-01-12, Howard: This issue will now tend to come up more often with move constructors
2484 and move assignment operators. For containers, these members transfer resources (i.e.
2485 the allocated memory) just like swap.
2490 Batavia: There is agreement to overload the container <tt>swap</tt> on the allocator's Swappable
2491 requirement using concepts. If the allocator supports Swappable, then container's swap will
2492 swap allocators, else it will perform a "slow swap" using copy construction and copy assignment.
2497 2009-04-28 Pablo adds:
2502 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2525.pdf">N2525</a>.
2503 I argued for marking this Tentatively-Ready right after Bellevue,
2504 but there was a concern that
2505 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2525.pdf">N2525</a>
2506 would break in the presence of the RVO. (That breakage had nothing to do with
2507 swap, but never-the-less). I addressed that breakage in in
2508 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2840.pdf">N2840</a>
2509 (Summit) by means of a non-normative reference:
2512 [<i>Note:</i> in situations where the copy constructor for a container is elided,
2513 this function is not called. The behavior in these cases is as if
2514 <tt>select_on_container_copy_construction</tt> returned <tt>x</tt> — <i>end note</i>]
2521 <p><b>Proposed resolution:</b></p>
2528 <h3><a name="446"></a>446. Iterator equality between different containers</h3>
2529 <p><b>Section:</b> 24.2 [iterator.concepts], 23.2 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2530 <b>Submitter:</b> Andy Koenig <b>Opened:</b> 2003-12-16 <b>Last modified:</b> 2009-07-14</p>
2531 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#iterator.concepts">active issues</a> in [iterator.concepts].</p>
2532 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iterator.concepts">issues</a> in [iterator.concepts].</p>
2533 <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>
2534 <p><b>Discussion:</b></p>
2536 What requirements does the standard place on equality comparisons between
2537 iterators that refer to elements of different containers. For example, if
2538 v1 and v2 are empty vectors, is v1.end() == v2.end() allowed to yield true?
2539 Is it allowed to throw an exception?
2543 The standard appears to be silent on both questions.
2545 <p><i>[Sydney: The intention is that comparing two iterators from
2546 different containers is undefined, but it's not clear if we say that,
2547 or even whether it's something we should be saying in clause 23 or in
2548 clause 24. Intuitively we might want to say that equality is defined
2549 only if one iterator is reachable from another, but figuring out how
2550 to say it in any sensible way is a bit tricky: reachability is defined
2551 in terms of equality, so we can't also define equality in terms of
2562 Daniel volunteered to work on this.
2567 <p><b>Proposed resolution:</b></p>
2575 <h3><a name="458"></a>458. 24.1.5 contains unintended limitation for operator-</h3>
2576 <p><b>Section:</b> 24.2.6 [random.access.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
2577 <b>Submitter:</b> Daniel Frey <b>Opened:</b> 2004-02-27 <b>Last modified:</b> 2009-07-17</p>
2578 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#random.access.iterators">active issues</a> in [random.access.iterators].</p>
2579 <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>
2580 <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>
2581 <p><b>Discussion:</b></p>
2583 In 24.1.5 [lib.random.access.iterators], table 76 the operational
2584 semantics for the expression "r -= n" are defined as "return r += -n".
2585 This means, that the expression -n must be valid, which is not the case
2590 Sydney: Possibly not a real problem, since difference type is required
2591 to be a signed integer type. However, the wording in the standard may
2592 be less clear than we would like.
2597 Post Summit Alisdair adds:
2603 This issue refers to a requirements table we have removed.
2606 The issue might now relate to 24.2.6 [random.access.iterators] p5.
2607 However, the rationale in the issue already recognises that the
2608 <tt>difference_type</tt> must be signed, so this really looks NAD.
2618 We agree with Alisdair's observations.
2632 Need to look at again without concepts.
2635 There was a question about this phrase in the discussion: "the
2636 expression -n must be valid, which is not the case for unsigned types."
2637 If n is an object ofthe iterator difference_type (eg ptrdiff_t), then it
2644 <p><b>Proposed resolution:</b></p>
2646 To remove this limitation, I suggest to change the
2647 operational semantics for this column to:
2649 <blockquote><pre> { Distance m = n;
2663 <h3><a name="463"></a>463. auto_ptr usability issues</h3>
2664 <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>
2665 <b>Submitter:</b> Rani Sharoni <b>Opened:</b> 2003-12-07 <b>Last modified:</b> 2009-07-14</p>
2666 <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>
2667 <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>
2668 <p><b>Discussion:</b></p>
2671 TC1 CWG DR #84 effectively made the template<class Y> operator auto_ptr<Y>()
2672 member of auto_ptr (20.4.5.3/4) obsolete.
2676 The sole purpose of this obsolete conversion member is to enable copy
2677 initialization base from r-value derived (or any convertible types like
2680 <pre>#include <memory>
2681 using std::auto_ptr;
2686 auto_ptr<D> source();
2687 int sink(auto_ptr<B>);
2688 int x1 = sink( source() ); // #1 EDG - no suitable copy constructor
2692 The excellent analysis of conversion operations that was given in the final
2694 (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1128.pdf)
2695 explicitly specifies this case analysis (case 4). DR #84 makes the analysis
2696 wrong and actually comes to forbid the loophole that was exploited by the
2701 I didn't encounter any compliant compiler (e.g. EDG, GCC, BCC and VC) that
2702 ever allowed this case. This is probably because it requires 3 user defined
2703 conversions and in fact current compilers conform to DR #84.
2707 I was surprised to discover that the obsolete conversion member actually has
2708 negative impact of the copy initialization base from l-value derived
2710 <pre>auto_ptr<D> dp;
2711 int x2 = sink(dp); // #2 EDG - more than one user-defined conversion applies
2715 I'm sure that the original intention was allowing this initialization using
2716 the template<class Y> auto_ptr(auto_ptr<Y>& a) constructor (20.4.5.1/4) but
2717 since in this copy initialization it's merely user defined conversion (UDC)
2718 and the obsolete conversion member is UDC with the same rank (for the early
2719 overloading stage) there is an ambiguity between them.
2723 Removing the obsolete member will have impact on code that explicitly
2726 <pre>int y = sink(source().operator auto_ptr<B>());
2730 IMHO no one ever wrote such awkward code and the reasonable workaround for
2733 <pre>int y = sink( auto_ptr<B>(source()) );
2737 I was even more surprised to find out that after removing the obsolete
2738 conversion member the initialization was still ill-formed:
2739 int x3 = sink(dp); // #3 EDG - no suitable copy constructor
2743 This copy initialization semantically requires copy constructor which means
2744 that both template conversion constructor and the auto_ptr_ref conversion
2745 member (20.4.5.3/3) are required which is what was explicitly forbidden in
2746 DR #84. This is a bit amusing case in which removing ambiguity results with
2751 I also found exception safety issue with auto_ptr related to auto_ptr_ref:
2753 <pre>int f(auto_ptr<B>, std::string);
2754 auto_ptr<B> source2();
2756 // string constructor throws while auto_ptr_ref
2757 // "holds" the pointer
2758 int x4 = f(source2(), "xyz"); // #4
2762 The theoretic execution sequence that will cause a leak:
2765 <li>call auto_ptr<B>::operator auto_ptr_ref<B>()</li>
2766 <li>call string::string(char const*) and throw</li>
2770 According to 20.4.5.3/3 and 20.4.5/2 the auto_ptr_ref conversion member
2771 returns auto_ptr_ref<Y> that holds *this and this is another defect since
2772 the type of *this is auto_ptr<X> where X might be different from Y. Several
2773 library vendors (e.g. SGI) implement auto_ptr_ref<Y> with Y* as member which
2774 is much more reasonable. Other vendor implemented auto_ptr_ref as
2775 defectively required and it results with awkward and catastrophic code:
2776 int oops = sink(auto_ptr<B>(source())); // warning recursive on all control
2781 Dave Abrahams noticed that there is no specification saying that
2782 auto_ptr_ref copy constructor can't throw.
2786 My proposal comes to solve all the above issues and significantly simplify
2787 auto_ptr implementation. One of the fundamental requirements from auto_ptr
2788 is that it can be constructed in an intuitive manner (i.e. like ordinary
2789 pointers) but with strict ownership semantics which yield that source
2790 auto_ptr in initialization must be non-const. My idea is to add additional
2791 constructor template with sole propose to generate ill-formed, diagnostic
2792 required, instance for const auto_ptr arguments during instantiation of
2793 declaration. This special constructor will not be instantiated for other
2794 types which is achievable using 14.8.2/2 (SFINAE). Having this constructor
2795 in hand makes the constructor template<class Y> auto_ptr(auto_ptr<Y> const&)
2796 legitimate since the actual argument can't be const yet non const r-value
2801 This implementation technique makes the "private auxiliary class"
2802 auto_ptr_ref obsolete and I found out that modern C++ compilers (e.g. EDG,
2803 GCC and VC) consume the new implementation as expected and allow all
2804 intuitive initialization and assignment cases while rejecting illegal cases
2805 that involve const auto_ptr arguments.
2808 <p>The proposed auto_ptr interface:</p>
2810 <pre>namespace std {
2811 template<class X> class auto_ptr {
2813 typedef X element_type;
2815 // 20.4.5.1 construct/copy/destroy:
2816 explicit auto_ptr(X* p=0) throw();
2817 auto_ptr(auto_ptr&) throw();
2818 template<class Y> auto_ptr(auto_ptr<Y> const&) throw();
2819 auto_ptr& operator=(auto_ptr&) throw();
2820 template<class Y> auto_ptr& operator=(auto_ptr<Y>) throw();
2821 ~auto_ptr() throw();
2823 // 20.4.5.2 members:
2824 X& operator*() const throw();
2825 X* operator->() const throw();
2826 X* get() const throw();
2827 X* release() throw();
2828 void reset(X* p=0) throw();
2831 template<class U>
2832 auto_ptr(U& rhs, typename
2833 unspecified_error_on_const_auto_ptr<U>::type = 0);
2839 One compliant technique to implement the unspecified_error_on_const_auto_ptr
2840 helper class is using additional private auto_ptr member class template like
2843 <pre>template<typename T> struct unspecified_error_on_const_auto_ptr;
2845 template<typename T>
2846 struct unspecified_error_on_const_auto_ptr<auto_ptr<T> const>
2847 { typedef typename auto_ptr<T>::const_auto_ptr_is_not_allowed type; };
2851 There are other techniques to implement this helper class that might work
2852 better for different compliers (i.e. better diagnostics) and therefore I
2853 suggest defining its semantic behavior without mandating any specific
2854 implementation. IMO, and I didn't found any compiler that thinks otherwise,
2855 14.7.1/5 doesn't theoretically defeat the suggested technique but I suggest
2856 verifying this with core language experts.
2859 <p><b>Further changes in standard text:</b></p>
2860 <p>Remove section 20.4.5.3</p>
2862 <p>Change 20.4.5/2 to read something like:
2863 Initializing auto_ptr<X> from const auto_ptr<Y> will result with unspecified
2864 ill-formed declaration that will require unspecified diagnostic.</p>
2866 <p>Change 20.4.5.1/4,5,6 to read:</p>
2868 <pre>template<class Y> auto_ptr(auto_ptr<Y> const& a) throw();</pre>
2869 <p> 4 Requires: Y* can be implicitly converted to X*.</p>
2870 <p> 5 Effects: Calls const_cast<auto_ptr<Y>&>(a).release().</p>
2871 <p> 6 Postconditions: *this holds the pointer returned from a.release().</p>
2873 <p>Change 20.4.5.1/10</p>
2874 <pre>template<class Y> auto_ptr& operator=(auto_ptr<Y> a) throw();
2877 10 Requires: Y* can be implicitly converted to X*. The expression delete
2878 get() is well formed.
2881 <p>LWG TC DR #127 is obsolete.</p>
2884 Notice that the copy constructor and copy assignment operator should remain
2885 as before and accept non-const auto_ptr& since they have effect on the form
2886 of the implicitly declared copy constructor and copy assignment operator of
2887 class that contains auto_ptr as member per 12.8/5,10:
2890 // implicit X(X&)
2891 // implicit X& operator=(X&)
2892 auto_ptr<D> aptr_;
2897 In most cases this indicates about sloppy programming but preserves the
2898 current auto_ptr behavior.
2902 Dave Abrahams encouraged me to suggest fallback implementation in case that
2903 my suggestion that involves removing of auto_ptr_ref will not be accepted.
2904 In this case removing the obsolete conversion member to auto_ptr<Y> and
2905 20.4.5.3/4,5 is still required in order to eliminate ambiguity in legal
2906 cases. The two constructors that I suggested will co exist with the current
2907 members but will make auto_ptr_ref obsolete in initialization contexts.
2908 auto_ptr_ref will be effective in assignment contexts as suggested in DR
2909 #127 and I can't see any serious exception safety issues in those cases
2910 (although it's possible to synthesize such). auto_ptr_ref<X> semantics will
2911 have to be revised to say that it strictly holds pointer of type X and not
2912 reference to an auto_ptr for the favor of cases in which auto_ptr_ref<Y> is
2913 constructed from auto_ptr<X> in which X is different from Y (i.e. assignment
2914 from r-value derived to base).
2917 <p><i>[Redmond: punt for the moment. We haven't decided yet whether we
2918 want to fix auto_ptr for C++-0x, or remove it and replace it with
2919 move_ptr and unique_ptr.]</i></p>
2923 Oxford 2007: Recommend NAD. We're just going to deprecate it. It still works for simple use cases
2924 and people know how to deal with it. Going forward <tt>unique_ptr</tt> is the recommended
2930 2007-11-09: Reopened at the request of David Abrahams, Alisdair Meredith and Gabriel Dos Reis.
2940 This is a complicated issue, so we agreed to defer discussion until
2941 later in the week so that interested parties can read up on it.
2946 <p><b>Proposed resolution:</b></p>
2948 Change the synopsis in D.9.1 [auto.ptr]:
2951 <blockquote><pre>namespace std {
2952 <del>template <class Y> struct auto_ptr_ref {};</del>
2954 <ins>// exposition only</ins>
2955 <ins>template <class T> struct constant_object;</ins>
2957 <ins>// exposition only</ins>
2958 <ins>template <class T></ins>
2959 <ins>struct cannot_transfer_ownership_from</ins>
2960 <ins>: constant_object<T> {};</ins>
2962 template <class X> class auto_ptr {
2964 typedef X element_type;
2966 // D.9.1.1 construct/copy/destroy:
2967 explicit auto_ptr(X* p =0) throw();
2968 auto_ptr(auto_ptr&) throw();
2969 template<class Y> auto_ptr(auto_ptr<Y><ins> const</ins>&) throw();
2970 auto_ptr& operator=(auto_ptr&) throw();
2971 template<class Y> auto_ptr& operator=(auto_ptr<Y><del>&</del>) throw();
2972 <del>auto_ptr& operator=(auto_ptr_ref<X> r) throw();</del>
2973 ~auto_ptr() throw();
2976 X& operator*() const throw();
2977 X* operator->() const throw();
2978 X* get() const throw();
2979 X* release() throw();
2980 void reset(X* p =0) throw();
2982 <del>// D.9.1.3 conversions:</del>
2983 <del>auto_ptr(auto_ptr_ref<X>) throw();</del>
2984 <del>template<class Y> operator auto_ptr_ref<Y>() throw();</del>
2985 <del>template<class Y> operator auto_ptr<Y>() throw();</del>
2987 <ins>// exposition only</ins>
2988 <ins>template<class U></ins>
2989 <ins>auto_ptr(U& rhs, typename cannot_transfer_ownership_from<U>::error = 0);</ins>
2992 template <> class auto_ptr<void>
2995 typedef void element_type;
3002 Remove D.9.1.3 [auto.ptr.conv].
3006 Change D.9.1 [auto.ptr], p3:
3010 The <tt>auto_ptr</tt> provides a semantics of strict ownership. An
3011 <tt>auto_ptr</tt> owns the object it holds a pointer to. Copying an
3012 <tt>auto_ptr</tt> copies the pointer and transfers ownership to the
3013 destination. If more than one <tt>auto_ptr</tt> owns the same object at
3014 the same time the behavior of the program is undefined. <ins>Templates
3015 <tt>constant_object</tt> and <tt>cannot_transfer_ownership_from</tt>,
3016 and the final constructor of <tt>auto_ptr</tt> are for exposition only.
3017 For any types <tt>X</tt> and <tt>Y</tt>, initializing
3018 <tt>auto_ptr<X></tt> from <tt>const auto_ptr<Y></tt> is
3019 ill-formed, diagnostic required.</ins> [<i>Note:</i> The uses of
3020 <tt>auto_ptr</tt> include providing temporary exception-safety for
3021 dynamically allocated memory, passing ownership of dynamically allocated
3022 memory to a function, and returning dynamically allocated memory from a
3023 function. <tt>auto_ptr</tt> does not meet the <tt>CopyConstructible</tt>
3024 and <tt>Assignable</tt> requirements for Standard Library container
3025 elements and thus instantiating a Standard Library container with an
3026 <tt>auto_ptr</tt> results in undefined behavior. <i>-- end note</i>]
3030 Change D.9.1.1 [auto.ptr.cons], p5:
3034 <pre>template<class Y> auto_ptr(auto_ptr<Y><ins> const</ins>& a) throw();
3038 <i>Requires:</i> <tt>Y*</tt> can be implicitly converted to <tt>X*</tt>.
3041 <i>Effects:</i> Calls <ins><tt>const_cast<auto_ptr<Y>&>(</tt></ins><tt>a</tt><ins><tt>)</tt></ins><tt>.release()</tt>.
3044 <i>Postconditions:</i> <tt>*this</tt> holds the pointer returned from <tt>a.release()</tt>.
3050 Change D.9.1.1 [auto.ptr.cons], p10:
3054 <pre>template<class Y> auto_ptr& operator=(auto_ptr<Y><del>&</del> a) throw();
3058 <i>Requires:</i> <tt>Y*</tt> can be implicitly converted to <tt>X*</tt>.
3059 The expression <tt>delete get()</tt> is well formed.
3062 <i>Effects:</i> Calls <tt>reset(a.release())</tt>.
3065 <i>Returns:</i> <tt>*this</tt>.
3076 <h3><a name="471"></a>471. result of what() implementation-defined</h3>
3077 <p><b>Section:</b> 18.8.1 [exception] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3078 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2004-06-28 <b>Last modified:</b> 2009-07-30</p>
3079 <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>
3080 <p><b>Discussion:</b></p>
3082 <p>[lib.exception] specifies the following:</p>
3083 <pre> exception (const exception&) throw();
3084 exception& operator= (const exception&) throw();
3086 -4- Effects: Copies an exception object.
3087 -5- Notes: The effects of calling what() after assignment
3088 are implementation-defined.
3092 First, does the Note only apply to the assignment operator? If so,
3093 what are the effects of calling what() on a copy of an object? Is
3094 the returned pointer supposed to point to an identical copy of
3095 the NTBS returned by what() called on the original object or not?
3099 Second, is this Note intended to extend to all the derived classes
3100 in section 19? I.e., does the standard provide any guarantee for
3101 the effects of what() called on a copy of any of the derived class
3102 described in section 19?
3106 Finally, if the answer to the first question is no, I believe it
3107 constitutes a defect since throwing an exception object typically
3108 implies invoking the copy ctor on the object. If the answer is yes,
3109 then I believe the standard ought to be clarified to spell out
3110 exactly what the effects are on the copy (i.e., after the copy
3114 <p><i>[Redmond: Yes, this is fuzzy. The issue of derived classes is
3119 Batavia: Howard provided wording.
3130 Eric concerned this is unimplementable, due to nothrow guarantees.
3131 Suggested implementation would involve reference counting.
3134 Is the implied reference counting subtle enough to call out a note on
3135 implementation? Probably not.
3138 If reference counting required, could we tighten specification further
3139 to require same pointer value? Probably an overspecification, especially
3140 if exception classes defer evalutation of final string to calls to
3144 Remember issue moved open and not resolved at Batavia, but cannot
3145 remember who objected to canvas a disenting opinion - please speak up if
3146 you disagree while reading these minutes!
3149 Move to Ready as we are accepting words unmodified.
3159 The issue was pulled from Ready. It needs to make clear that only homogenous copying
3160 is intended to be supported, not coping from a derived to a base.
3169 Howard supplied the following replacement wording
3170 for paragraph 7 of the proposed resolution:
3173 <ins>-7- <i>Postcondition:</i> <tt>what()</tt> shall return the same NTBS
3174 as would be obtained by using <tt>static_cast</tt>
3175 to cast the rhs to the same types as the lhs
3176 and then calling <tt>what()</tt> on that possibly sliced object.</ins>
3179 Pete asks what "the same NTBS" means.
3184 2009-07-30 Niels adds:
3189 Further discussion in the thread starting with c++std-lib-24512.
3194 <p><b>Proposed resolution:</b></p>
3197 Change 18.8.1 [exception] to:
3201 <pre>exception(const exception& <ins><i>e</i></ins>) throw();
3202 exception& operator=(const exception& <ins><i>e</i></ins>) throw();</pre>
3205 -4- <i>Effects:</i> Copies an exception object.
3208 <del> -5- <i>Remarks:</i> The effects of calling what() after assignment are implementation-defined.</del>
3211 <ins>-5- <i>Throws:</i> Nothing. This also applies
3212 to all standard library-defined classes that derive from <tt>exception</tt>.</ins>
3215 <ins>-7- <i>Postcondition:</i> <tt>strcmp(what(), <i>e</i>.what()) == 0</tt>. This also applies
3216 to all standard library-defined classes that derive from <tt>exception</tt>.</ins>
3226 <h3><a name="473"></a>473. underspecified ctype calls</h3>
3227 <p><b>Section:</b> 22.4.1.1 [locale.ctype] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
3228 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2004-07-01 <b>Last modified:</b> 2009-07-17</p>
3229 <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>
3230 <p><b>Discussion:</b></p>
3232 Most ctype member functions come in two forms: one that operates
3233 on a single character at a time and another form that operates
3234 on a range of characters. Both forms are typically described by
3235 a single Effects and/or Returns clause.
3238 The Returns clause of each of the single-character non-virtual forms
3239 suggests that the function calls the corresponding single character
3240 virtual function, and that the array form calls the corresponding
3241 virtual array form. Neither of the two forms of each virtual member
3242 function is required to be implemented in terms of the other.
3245 There are three problems:
3248 1. One is that while the standard does suggest that each non-virtual
3249 member function calls the corresponding form of the virtual function,
3250 it doesn't actually explicitly require it.
3253 Implementations that cache results from some of the virtual member
3254 functions for some or all values of their arguments might want to
3255 call the array form from the non-array form the first time to fill
3256 the cache and avoid any or most subsequent virtual calls. Programs
3257 that rely on each form of the virtual function being called from
3258 the corresponding non-virtual function will see unexpected behavior
3259 when using such implementations.
3262 2. The second problem is that either form of each of the virtual
3263 functions can be overridden by a user-defined function in a derived
3264 class to return a value that is different from the one produced by
3265 the virtual function of the alternate form that has not been
3269 Thus, it might be possible for, say, ctype::widen(c) to return one
3270 value, while for ctype::widen(&c, &c + 1, &wc) to set
3271 wc to another value. This is almost certainly not intended. Both
3272 forms of every function should be required to return the same result
3273 for the same character, otherwise the same program using an
3274 implementation that calls one form of the functions will behave
3275 differently than when using another implementation that calls the
3276 other form of the function "under the hood."
3279 3. The last problem is that the standard text fails to specify whether
3280 one form of any of the virtual functions is permitted to be implemented
3281 in terms of the other form or not, and if so, whether it is required
3282 or permitted to call the overridden virtual function or not.
3285 Thus, a program that overrides one of the virtual functions so that
3286 it calls the other form which then calls the base member might end
3287 up in an infinite loop if the called form of the base implementation
3288 of the function in turn calls the other form.
3291 Lillehammer: Part of this isn't a real problem. We already talk about
3292 caching. 22.1.1/6 But part is a real problem. ctype virtuals may call
3293 each other, so users don't know which ones to override to avoid avoid
3296 <p>This is a problem for all facet virtuals, not just ctype virtuals,
3297 so we probably want a blanket statement in clause 22 for all
3298 facets. The LWG is leaning toward a blanket prohibition, that a
3299 facet's virtuals may never call each other. We might want to do that
3300 in clause 27 too, for that matter. A review is necessary. Bill will
3301 provide wording.</p>
3304 2009-07 Frankfurt, Howard provided wording directed by consensus.
3310 <p><b>Proposed resolution:</b></p>
3312 Add paragraph 3 to 22.4 [locale.categories]:
3316 -3- Within this clause it is unspecified if one virtual function calls another
3325 <h3><a name="484"></a>484. Convertible to T</h3>
3326 <p><b>Section:</b> 24.2.2 [input.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3327 <b>Submitter:</b> Chris Jefferson <b>Opened:</b> 2004-09-16 <b>Last modified:</b> 2009-07-28</p>
3328 <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>
3329 <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>
3330 <p><b>Discussion:</b></p>
3331 <p>From comp.std.c++:</p>
3334 I note that given an input iterator a for type T,
3335 then *a only has to be "convertable to T", not actually of type T.
3338 <p>Firstly, I can't seem to find an exact definition of "convertable to T".
3339 While I assume it is the obvious definition (an implicit conversion), I
3340 can't find an exact definition. Is there one?</p>
3342 <p>Slightly more worryingly, there doesn't seem to be any restriction on
3343 the this type, other than it is "convertable to T". Consider two input
3344 iterators a and b. I would personally assume that most people would
3345 expect *a==*b would perform T(*a)==T(*b), however it doesn't seem that
3346 the standard requires that, and that whatever type *a is (call it U)
3347 could have == defined on it with totally different symantics and still
3348 be a valid inputer iterator.</p>
3350 <p>Is this a correct reading? When using input iterators should I write
3351 T(*a) all over the place to be sure that the object i'm using is the
3354 <p>This is especially a nuisance for operations that are defined to be
3355 "convertible to bool". (This is probably allowed so that
3356 implementations could return say an int and avoid an unnessary
3357 conversion. However all implementations I have seen simply return a
3358 bool anyway. Typical implemtations of STL algorithms just write
3359 things like <tt>while(a!=b && *a!=0)</tt>. But strictly
3360 speaking, there are lots of types that are convertible to T but
3361 that also overload the appropriate operators so this doesn't behave
3364 <p>If we want to make code like this legal (which most people seem to
3365 expect), then we'll need to tighten up what we mean by "convertible
3368 <p><i>[Lillehammer: The first part is NAD, since "convertible" is
3369 well-defined in core. The second part is basically about pathological
3370 overloads. It's a minor problem but a real one. So leave open for
3371 now, hope we solve it as part of iterator redesign.]</i></p>
3375 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
3381 <p><b>Proposed resolution:</b></p>
3384 <p><b>Rationale:</b></p>
3392 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/N2758.pdf">N2758</a>.
3402 <h3><a name="485"></a>485. output iterator insufficiently constrained</h3>
3403 <p><b>Section:</b> 24.2.3 [output.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3404 <b>Submitter:</b> Chris Jefferson <b>Opened:</b> 2004-10-13 <b>Last modified:</b> 2009-07-21</p>
3405 <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>
3406 <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>
3407 <p><b>Discussion:</b></p>
3409 The note on 24.1.2 Output iterators insufficiently limits what can be
3410 performed on output iterators. While it requires that each iterator is
3411 progressed through only once and that each iterator is written to only
3412 once, it does not require the following things:</p>
3414 <p>Note: Here it is assumed that x is an output iterator of type X which
3415 has not yet been assigned to.</p>
3417 <p>a) That each value of the output iterator is written to:
3418 The standard allows:
3423 b) That assignments to the output iterator are made in order
3424 X a(x); ++a; *a=1; *x=2; is allowed
3428 c) Chains of output iterators cannot be constructed:
3429 X a(x); ++a; X b(a); ++b; X c(b); ++c; is allowed, and under the current
3430 wording (I believe) x,a,b,c could be written to in any order.
3433 <p>I do not believe this was the intension of the standard?</p>
3434 <p><i>[Lillehammer: Real issue. There are lots of constraints we
3435 intended but didn't specify. Should be solved as part of iterator
3445 Bill provided wording according to consensus.
3449 2009-07-21 Alsidair requests change from Review to Open. See thread starting
3450 with c++std-lib-24459 for discussion.
3456 <p><b>Proposed resolution:</b></p>
3458 Change Table 101 — Output iterator requirements in 24.2.3 [output.iterators]:
3462 <caption>Table 101 — Output iterator requirements</caption>
3465 <th>Return type</th>
3466 <th>Operational semantics</th>
3467 <th>Assertion/note pre-/post-condition</th>
3481 <tt>a = t</tt> is equivalent to <tt>X(a) = t</tt>. note: a destructor is assumed.
3487 <tt>X u(a);</tt><br>
3527 <tt>&r == &++r</tt>
3536 convertible to <tt>const X&</tt>
3539 <tt>{X tmp = r;<br>++r;<br>return tmp;}</tt>
3548 <tt>*r++ = o<br>*r = o, ++r<br>*r = o, r++</tt>
3551 result is not <del>used</del> <ins>usable</ins>
3557 <ins>Note: only these forms permitted</ins>
3569 <h3><a name="498"></a>498. Requirements for partition() and stable_partition() too strong</h3>
3570 <p><b>Section:</b> 25.4.13 [alg.partitions] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
3571 <b>Submitter:</b> Sean Parent, Joe Gottman <b>Opened:</b> 2005-05-04 <b>Last modified:</b> 2009-07-15</p>
3572 <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>
3573 <p><b>Discussion:</b></p>
3576 The iterator requirements for partition() and stable_partition() [25.2.12]
3577 are listed as BidirectionalIterator, however, there are efficient algorithms
3578 for these functions that only require ForwardIterator that have been known
3579 since before the standard existed. The SGI implementation includes these (see
3580 <a href="http://www.sgi.com/tech/stl/partition.html">http://www.sgi.com/tech/stl/partition.html</a>
3582 <a href="http://www.sgi.com/tech/stl/stable_partition.html">http://www.sgi.com/tech/stl/stable_partition.html</a>).
3586 2009-04-30 Alisdair adds:
3592 Now we have concepts this is easier to express!
3595 Proposed resolution:
3598 Add the following signature to:
3601 Header <tt><algorithm></tt> synopsis 25.2 [algorithms.syn]<br>
3602 p3 Partitions 25.4.13 [alg.partitions]
3604 <blockquote><pre> template<ForwardIterator Iter, Predicate<auto, Iter::value_type> Pred>
3605 requires ShuffleIterator<Iter>
3606 && CopyConstructible<Pred>
3607 Iter partition(Iter first, Iter last, Pred pred);
3611 Update p3 Partitions 25.4.13 [alg.partitions]:
3616 <i>Complexity:</i> <del>At most <tt>(last - first)/2</tt> swaps. Exactly <tt>last - first</tt>
3617 applications of the predicate
3620 If <tt>Iter</tt> satisfies <tt>BidirectionalIterator</tt>, at most <tt>(last -
3621 first)/2</tt> swaps. Exactly <tt>last - first</tt> applications of the predicate
3626 If <tt>Iter</tt> merely satisfied <tt>ForwardIterator</tt> at most <tt>(last - first)</tt> swaps
3627 are done. Exactly <tt>(last - first)</tt> applications of the predicate are done.
3632 [Editorial note: I looked for existing precedent in how we might call out
3633 distinct overloads overloads from a set of constrained templates, but there
3634 is not much existing practice to lean on. advance/distance were the only
3635 algorithms I could find, and that wording is no clearer.]
3647 Hinnant: if you want to partition your std::forward_list, you'll need
3648 partition() to accept ForwardIterators.
3651 No objection to Ready.
3660 <p><b>Proposed resolution:</b></p>
3662 Change 25.2.12 from </p>
3663 <blockquote><pre>template<class BidirectionalIterator, class Predicate>
3664 BidirectionalIterator partition(BidirectionalIterato r first,
3665 BidirectionalIterator last,
3669 <blockquote><pre>template<class ForwardIterator, class Predicate>
3670 ForwardIterator partition(ForwardIterator first,
3671 ForwardIterator last,
3674 <p>Change the complexity from </p>
3677 At most (last - first)/2 swaps are done. Exactly (last - first)
3678 applications of the predicate are done.
3684 If ForwardIterator is a bidirectional_iterator, at most (last - first)/2
3685 swaps are done; otherwise at most (last - first) swaps are done. Exactly
3686 (last - first) applications of the predicate are done.
3691 <p><b>Rationale:</b></p>
3693 Partition is a "foundation" algorithm useful in many contexts (like sorting
3694 as just one example) - my motivation for extending it to include forward
3695 iterators is foward_list - without this extension you can't partition an foward_list
3696 (without writing your own partition). Holes like this in the standard
3697 library weaken the argument for generic programming (ideally I'd be able
3698 to provide a library that would refine std::partition() to other concepts
3699 without fear of conflicting with other libraries doing the same - but
3700 that is a digression). I consider the fact that partition isn't defined
3701 to work for ForwardIterator a minor embarrassment.
3704 <p><i>[Mont Tremblant: Moved to Open, request motivation and use cases
3705 by next meeting. Sean provided further rationale by post-meeting
3715 <h3><a name="532"></a>532. Tuple comparison</h3>
3716 <p><b>Section:</b> 20.5.2.5 [tuple.rel], TR1 6.1.3.5 [tr.tuple.rel] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3717 <b>Submitter:</b> David Abrahams <b>Opened:</b> 2005-11-29 <b>Last modified:</b> 2009-07-28</p>
3718 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple.rel">issues</a> in [tuple.rel].</p>
3719 <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>
3720 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#348">348</a></p>
3721 <p><b>Discussion:</b></p>
3723 Where possible, tuple comparison operators <,<=,=>, and > ought to be
3724 defined in terms of std::less rather than operator<, in order to
3725 support comparison of tuples of pointers.
3729 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
3735 <p><b>Proposed resolution:</b></p>
3737 change 6.1.3.5/5 from:
3741 Returns: The result of a lexicographical comparison between t and
3742 u. The result is defined as: (bool)(get<0>(t) < get<0>(u)) ||
3743 (!(bool)(get<0>(u) < get<0>(t)) && ttail < utail), where rtail for
3744 some tuple r is a tuple containing all but the first element of
3745 r. For any two zero-length tuples e and f, e < f returns false.
3754 Returns: The result of a lexicographical comparison between t and
3755 u. For any two zero-length tuples e and f, e < f returns false.
3756 Otherwise, the result is defined as: cmp( get<0>(t), get<0>(u)) ||
3757 (!cmp(get<0>(u), get<0>(t)) && ttail < utail), where rtail for some
3758 tuple r is a tuple containing all but the first element of r, and
3759 cmp(x,y) is an unspecified function template defined as follows.
3762 Where T is the type of x and U is the type of y:
3766 if T and U are pointer types and T is convertible to U, returns
3767 less<U>()(x,y)
3771 otherwise, if T and U are pointer types, returns less<T>()(x,y)
3775 otherwise, returns (bool)(x < y)
3780 Berlin: This issue is much bigger than just tuple (pair, containers,
3781 algorithms). Dietmar will survey and work up proposed wording.
3787 <p><b>Rationale:</b></p>
3789 Recommend NAD. This will be fixed with the next revision of concepts.
3799 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2770.pdf">N2770</a>.
3807 <h3><a name="539"></a>539. partial_sum and adjacent_difference should mention requirements</h3>
3808 <p><b>Section:</b> 26.7.3 [partial.sum] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
3809 <b>Submitter:</b> Marc Schoolderman <b>Opened:</b> 2006-02-06 <b>Last modified:</b> 2009-07-30</p>
3810 <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>
3811 <p><b>Discussion:</b></p>
3813 There are some problems in the definition of partial_sum and
3814 adjacent_difference in 26.4 [lib.numeric.ops]
3818 Unlike <tt>accumulate</tt> and <tt>inner_product</tt>, these functions are not
3819 parametrized on a "type T", instead, 26.4.3 [lib.partial.sum] simply
3820 specifies the effects clause as;
3824 Assigns to every element referred to by iterator <tt>i</tt> in the range
3825 <tt>[result,result + (last - first))</tt> a value correspondingly equal to
3827 <blockquote><pre>((...(* first + *( first + 1)) + ...) + *( first + ( i - result )))
3832 And similarly for BinaryOperation. Using just this definition, it seems
3833 logical to expect that:
3837 <blockquote><pre>char i_array[4] = { 100, 100, 100, 100 };
3840 std::partial_sum(i_array, i_array+4, o_array);
3847 <blockquote><pre>int o_array[4] = { 100, 100+100, 100+100+100, 100+100+100+100 };
3851 i.e. 100, 200, 300, 400, with addition happening in the <tt>result type</tt>,
3856 Yet all implementations I have tested produce 100, -56, 44, -112,
3857 because they are using an accumulator of the <tt>InputIterator</tt>'s
3858 <tt>value_type</tt>, which in this case is <tt>char</tt>, not <tt>int</tt>.
3862 The issue becomes more noticeable when the result of the expression <tt>*i +
3863 *(i+1)</tt> or <tt>binary_op(*i, *i-1)</tt> can't be converted to the
3864 <tt>value_type</tt>. In a contrived example:
3867 <blockquote><pre>enum not_int { x = 1, y = 2 };
3869 not_int e_array[4] = { x, x, y, y };
3870 std::partial_sum(e_array, e_array+4, o_array);
3874 Is it the intent that the operations happen in the <tt>input type</tt>, or in
3875 the <tt>result type</tt>?
3879 If the intent is that operations happen in the <tt>result type</tt>, something
3880 like this should be added to the "Requires" clause of 26.4.3/4
3885 The type of <tt>*i + *(i+1)</tt> or <tt>binary_op(*i, *(i+1))</tt> shall meet the
3886 requirements of <tt>CopyConstructible</tt> (20.1.3) and <tt>Assignable</tt>
3891 (As also required for <tt>T</tt> in 26.4.1 [lib.accumulate] and 26.4.2
3892 [lib.inner.product].)
3896 The "auto initializer" feature proposed in
3897 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1894.pdf">N1894</a>
3899 implement <tt>partial_sum</tt> this way. The 'narrowing' behaviour can still be
3900 obtained by using the <tt>std::plus<></tt> function object.
3904 If the intent is that operations happen in the <tt>input type</tt>, then
3905 something like this should be added instead;
3909 The type of *first shall meet the requirements of
3910 <tt>CopyConstructible</tt> (20.1.3) and <tt>Assignable</tt> (23.1) types.
3911 The result of <tt>*i + *(i+1)</tt> or <tt>binary_op(*i, *(i+1))</tt> shall be
3912 convertible to this type.
3916 The 'widening' behaviour can then be obtained by writing a custom proxy
3917 iterator, which is somewhat involved.
3921 In both cases, the semantics should probably be clarified.
3925 26.4.4 [lib.adjacent.difference] is similarly underspecified, although
3926 all implementations seem to perform operations in the 'result' type:
3929 <blockquote><pre>unsigned char i_array[4] = { 4, 3, 2, 1 };
3932 std::adjacent_difference(i_array, i_array+4, o_array);
3936 o_array is 4, -1, -1, -1 as expected, not 4, 255, 255, 255.
3940 In any case, <tt>adjacent_difference</tt> doesn't mention the requirements on the
3941 <tt>value_type</tt>; it can be brought in line with the rest of 26.4
3942 [lib.numeric.ops] by adding the following to 26.4.4/2
3943 [lib.adjacent.difference]:
3947 The type of <tt>*first</tt> shall meet the requirements of
3948 <tt>CopyConstructible</tt> (20.1.3) and <tt>Assignable</tt> (23.1) types."
3951 Berlin: Giving output iterator's value_types very controversial. Suggestion of
3952 adding signatures to allow user to specify "accumulator".
3962 The intent of the algorithms is to perform their calculations using the type of the input iterator.
3963 Proposed wording provided.
3972 We did not agree that the proposed resolution was correct. For example,
3973 when the arguments are types <tt>(float*, float*, double*)</tt>, the
3974 highest-quality solution would use double as the type of the
3975 accumulator. If the intent of the wording is to require that the type of
3976 the accumulator must be the <tt>input_iterator</tt>'s <tt>value_type</tt>, the wording
3981 2009-05-09 Alisdair adds:
3987 Now that we have the facility, the 'best' accumulator type could probably be
3990 <blockquote><pre>std::common_type<InIter::value_type, OutIter::reference>::type
3993 This type would then have additional requirements of constructability and
3994 incrementability/assignability.
3997 If this extracting an accumulator type from a pair/set of iterators (with
3998 additional requirements on that type) is a problem for multiple functions,
3999 it might be worth extracting into a SharedAccumulator concept or similar.
4002 I'll go no further in writing up wording now, until the group gives a
4003 clearer indication of preferred direction.
4013 The proposed resolution isn't quite right. For example, "the type of
4014 *first" should be changed to "iterator::value_type" or similar. Daniel
4015 volunteered to correct the wording.
4019 2009-07-29 Daniel corrected wording.
4024 <p><b>Proposed resolution:</b></p>
4031 Change 26.7.3 [partial.sum]/1 as indicated:
4036 <i>Effects:</i> <ins>Let <tt>VT</tt> be <tt>InputIterator</tt>'s value type. For a nonempty range,
4037 initializes an accumulator <tt>acc</tt> of type <tt>VT</tt> with <tt>*first</tt> and performs
4038 <tt>*result = acc</tt>. For every iterator <tt>i</tt> in <tt>[first + 1, last)</tt> in order, <tt>acc</tt> is then
4039 modified by <tt>acc = acc + *i</tt> or <tt>acc = binary_op(acc, *i)</tt> and is assigned
4040 to <tt>*(result + (i - first))</tt>.</ins> <del>Assigns to every element referred to by
4041 iterator <tt>i</tt> in the range <tt>[result,result + (last - first))</tt> a value
4046 <blockquote><pre><del>
4047 ((...(*first + *(first + 1)) + ...) + *(first + (i - result)))
4048 </del></pre></blockquote>
4054 <blockquote><pre><del>
4055 binary_op(binary_op(...,
4056 binary_op(*first, *(first + 1)),...), *(first + (i - result)))
4057 </del></pre></blockquote>
4063 Change 26.7.3 [partial.sum]/3 as indicated:
4067 <i>Complexity:</i> Exactly <tt><ins>max(</ins>(last - first) - 1<ins>, 0)</ins></tt>
4069 of <tt><del>binary_op</del></tt><ins>the binary operation</ins>.
4075 Change 26.7.3 [partial.sum]/4 as indicated:
4079 <i>Requires:</i> <ins><tt>VT</tt> shall be constructible from the type of <tt>*first</tt>, the result of
4080 <tt>acc + *i</tt> or <tt>binary_op(acc, *i)</tt> shall be implicitly convertible to <tt>VT</tt>, and
4081 the result of the expression <tt>acc</tt> shall be writable to the <tt>result</tt>
4082 output iterator.</ins> In the ranges <tt>[first,last]</tt> and
4083 <tt>[result,result + (last - first)]</tt> [..]
4089 Change 26.7.4 [adjacent.difference]/1 as indicated:
4094 <i>Effects:</i> <ins>Let <tt>VT</tt> be <tt>InputIterator</tt>'s value type. For a nonempty range,
4095 initializes an accumulator <tt>acc</tt> of type <tt>VT</tt> with <tt>*first</tt> and performs
4096 <tt>*result = acc</tt>. For every iterator <tt>i</tt> in <tt>[first + 1, last)</tt> in order,
4098 value <tt>val</tt> of type <tt>VT</tt> with <tt>*i</tt>, assigns the result of <tt>val - acc</tt> or
4099 <tt>binary_op(val, acc)</tt>
4100 to <tt>*(result + (i - first))</tt> and modifies <tt>acc = std::move(val)</tt>.</ins>
4101 <del>Assigns to every element referred to by iterator <tt>i</tt> in the range
4103 result + (last - first))</tt> a value correspondingly equal to</del>
4106 <blockquote><pre><del>
4107 *(first + (i - result)) - *(first + (i - result) - 1)
4108 </del></pre></blockquote>
4114 <blockquote><pre><del>
4115 binary_op(*(first + (i - result)), *(first + (i - result) - 1)).
4116 </del></pre></blockquote>
4119 result gets the value of *first.</del>
4126 Change 26.7.4 [adjacent.difference]/2 as indicated:
4130 <i>Requires:</i> <ins><tt>VT</tt> shall be <tt>MoveAssignable</tt> ([moveassignable])
4132 constructible from the type of <tt>*first</tt>. The result
4133 of the expression <tt>acc</tt> and the result of the expression <tt>val - acc</tt> or
4134 <tt>binary_op(val, acc)</tt>
4135 shall be writable to the <tt>result</tt> output iterator.</ins> In the ranges
4136 <tt>[first,last]</tt> [..]
4142 Change 26.7.4 [adjacent.difference]/5 as indicated:
4146 <i>Complexity:</i> Exactly <tt><ins>max(</ins>(last - first) - 1<ins>, 0)</ins></tt>
4148 of <del><tt>binary_op</tt></del><ins>the binary operation</ins>.
4161 <h3><a name="556"></a>556. is Compare a BinaryPredicate?</h3>
4162 <p><b>Section:</b> 25.5 [alg.sorting] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4163 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2006-02-05 <b>Last modified:</b> 2009-07-28</p>
4164 <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>
4165 <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>
4166 <p><b>Discussion:</b></p>
4168 In 25, p8 we allow BinaryPredicates to return a type that's convertible
4169 to bool but need not actually be bool. That allows predicates to return
4170 things like proxies and requires that implementations be careful about
4171 what kinds of expressions they use the result of the predicate in (e.g.,
4172 the expression in if (!pred(a, b)) need not be well-formed since the
4173 negation operator may be inaccessible or return a type that's not
4174 convertible to bool).
4177 Here's the text for reference:
4180 ...if an algorithm takes BinaryPredicate binary_pred as its argument
4181 and first1 and first2 as its iterator arguments, it should work
4182 correctly in the construct if (binary_pred(*first1, first2)){...}.
4186 In 25.3, p2 we require that the Compare function object return true
4187 of false, which would seem to preclude such proxies. The relevant text
4191 Compare is used as a function object which returns true if the first
4192 argument is less than the second, and false otherwise...
4196 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
4202 <p><b>Proposed resolution:</b></p>
4204 I think we could fix this by rewording 25.3, p2 to read somthing like:
4207 -2- <tt>Compare</tt> is <del>used as a function object which returns
4208 <tt>true</tt> if the first argument</del> <ins>a <tt>BinaryPredicate</tt>. The
4209 return value of the function call operator applied to an object of type
4210 <tt>Compare</tt>, when converted to type <tt>bool</tt>, yields <tt>true</tt>
4211 if the first argument of the call</ins> is less than the second, and
4212 <tt>false</tt> otherwise. <tt>Compare <i>comp</i></tt> is used throughout for
4213 algorithms assuming an ordering relation. It is assumed that <tt><i>comp</i></tt>
4214 will not apply any non-constant function through the dereferenced iterator.
4219 Portland: Jack to define "convertible to bool" such that short circuiting isn't
4224 <p><b>Rationale:</b></p>
4232 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2774.pdf">N2774</a>).
4241 <h3><a name="564"></a>564. stringbuf seekpos underspecified</h3>
4242 <p><b>Section:</b> 27.8.1.4 [stringbuf.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
4243 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2006-02-23 <b>Last modified:</b> 2009-07-15</p>
4244 <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>
4245 <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>
4246 <p><b>Discussion:</b></p>
4248 The effects of the <code>seekpos()</code> member function of
4249 <code>basic_stringbuf</code> simply say that the function positions
4250 the input and/or output sequences but fail to spell out exactly
4251 how. This is in contrast to the detail in which <code>seekoff()</code>
4266 <p><b>Proposed resolution:</b></p>
4269 Change 27.7.1.3, p13 to read:
4274 -13- <i>Effects:</i> <ins>Equivalent to <tt>seekoff(off_type(<i>sp</i>), ios_base::beg,
4275 <i>which</i>)</tt>.</ins> <del>Alters the stream position within the controlled sequences,
4276 if possible, to correspond to the stream position stored in <tt><i>sp</i></tt>
4277 (as described below).</del>
4280 <li><del>If <tt>(<i>which</i> & ios_base::in) != 0</tt>, positions the input sequence.</del></li>
4281 <li><del>If <tt>(<i>which</i> & ios_base::out) != 0</tt>, positions the output sequence.</del></li>
4282 <li><del>If <tt><i>sp</i></tt> is an invalid stream position, or if the function
4283 positions neither sequence, the positioning operation fails. If <tt><i>sp</i></tt>
4284 has not been obtained by a previous successful call to one of the positioning
4285 functions (<tt>seekoff</tt>, <tt>seekpos</tt>, <tt>tellg</tt>, <tt>tellp</tt>)
4286 the effect is undefined.</del></li>
4292 Kona (2007): A <tt>pos_type</tt> is a position in a stream by
4293 definition, so there is no ambiguity as to what it means. Proposed
4299 Post-Kona Martin adds:
4300 I'm afraid I disagree
4301 with the Kona '07 rationale for marking it NAD. The only text
4302 that describes precisely what it means to position the input
4303 or output sequence is in <tt>seekoff()</tt>. The <tt>seekpos()</tt> Effects
4304 clause is inadequate in comparison and the proposed resolution
4305 plugs the hole by specifying <tt>seekpos()</tt> in terms of <tt>seekoff()</tt>.
4313 <h3><a name="565"></a>565. xsputn inefficient</h3>
4314 <p><b>Section:</b> 27.6.2.4.5 [streambuf.virt.put] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
4315 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2006-02-23 <b>Last modified:</b> 2009-07-15</p>
4316 <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>
4317 <p><b>Discussion:</b></p>
4320 <tt>streambuf::xsputn()</tt> is specified to have the effect of
4321 "writing up to <tt>n</tt> characters to the output sequence as if by
4322 repeated calls to <tt>sputc(c)</tt>."
4327 Since <tt>sputc()</tt> is required to call <tt>overflow()</tt> when
4328 <tt>(pptr() == epptr())</tt> is true, strictly speaking
4329 <tt>xsputn()</tt> should do the same. However, doing so would be
4330 suboptimal in some interesting cases, such as in unbuffered mode or
4331 when the buffer is <tt>basic_stringbuf</tt>.
4336 Assuming calling <tt>overflow()</tt> is not really intended to be
4337 required and the wording is simply meant to describe the general
4338 effect of appending to the end of the sequence it would be worthwhile
4339 to mention in <tt>xsputn()</tt> that the function is not actually
4340 required to cause a call to <tt>overflow()</tt>.
4355 <p><b>Proposed resolution:</b></p>
4358 Add the following sentence to the <tt>xsputn()</tt> Effects clause in
4359 27.5.2.4.5, p1 (N1804):
4364 -1- <i>Effects:</i> Writes up to <tt><i>n</i></tt> characters to the output
4365 sequence as if by repeated calls to <tt>sputc(<i>c</i>)</tt>. The characters
4366 written are obtained from successive elements of the array whose first element
4367 is designated by <tt><i>s</i></tt>. Writing stops when either <tt><i>n</i></tt>
4368 characters have been written or a call to <tt>sputc(<i>c</i>)</tt> would return
4369 <tt>traits::eof()</tt>. <ins>It is uspecified whether the function calls
4370 <tt>overflow()</tt> when <tt>(pptr() == epptr())</tt> becomes true or whether
4371 it achieves the same effects by other means.</ins>
4376 In addition, I suggest to add a footnote to this function with the
4377 same text as Footnote 292 to make it extra clear that derived classes
4378 are permitted to override <tt>xsputn()</tt> for efficiency.
4384 Kona (2007): We want to permit a <tt>streambuf</tt> that streams output directly
4385 to a device without making calls to <tt>sputc</tt> or <tt>overflow</tt>. We believe that
4386 has always been the intention of the committee. We believe that the
4387 proposed wording doesn't accomplish that. Proposed Disposition: Open
4395 <h3><a name="580"></a>580. unused allocator members</h3>
4396 <p><b>Section:</b> 23.2.1 [container.requirements.general] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4397 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2006-06-14 <b>Last modified:</b> 2009-07-15</p>
4398 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements.general">active issues</a> in [container.requirements.general].</p>
4399 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements.general">issues</a> in [container.requirements.general].</p>
4400 <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>
4401 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#479">479</a></p>
4402 <p><b>Discussion:</b></p>
4405 C++ Standard Library templates that take an allocator as an argument
4406 are required to call the <code>allocate()</code> and
4407 <code>deallocate()</code> members of the allocator object to obtain
4408 storage. However, they do not appear to be required to call any other
4409 allocator members such as <code>construct()</code>,
4410 <code>destroy()</code>, <code>address()</code>, and
4411 <code>max_size()</code>. This makes these allocator members less than
4412 useful in portable programs.
4417 It's unclear to me whether the absence of the requirement to use these
4418 allocator members is an unintentional omission or a deliberate
4419 choice. However, since the functions exist in the standard allocator
4420 and since they are required to be provided by any user-defined
4421 allocator I believe the standard ought to be clarified to explictly
4422 specify whether programs should or should not be able to rely on
4423 standard containers calling the functions.
4428 I propose that all containers be required to make use of these
4433 Batavia: We support this resolution. Martin to provide wording.
4437 pre-Oxford: Martin provided wording.
4442 2009-04-28 Pablo adds:
4447 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2554.pdf">N2554</a>
4448 (scoped allocators),
4449 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2768.pdf">N2768</a>
4450 (allocator concepts), and
4451 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2810.pdf">N2810</a>
4452 (allocator defects), address all of these points EXCEPT <tt>max_size()</tt>.
4453 So, I would add a note to that affect and re-class the defect as belonging
4454 to section 23.2.1 [container.requirements.general].
4463 The comment in the description of this issue that this "would be"
4464 rendered editorial by the adoption of N2257 is confusing. It appears
4465 that N2257 was never adopted.
4470 <p><b>Proposed resolution:</b></p>
4473 Specifically, I propose to change 23.2 [container.requirements],
4479 -9- Copy constructors for all container types defined in this clause
4480 <ins>that are parametrized on <code>Allocator</code></ins> copy
4481 <del>an</del><ins>the</ins> allocator argument from their respective
4484 All other constructors for these container types take a<del>n</del>
4485 <ins>const</ins> <code>Allocator&</code> argument (20.1.6), an
4486 allocator whose <code>value_type</code> is the same as the container's
4487 <code>value_type</code>.
4489 A copy of this argument <del>is</del><ins>shall be</ins> used for any
4490 memory allocation <ins> and deallocation</ins> performed<del>,</del>
4491 by these constructors and by all member functions<del>,</del> during
4492 the lifetime of each container object. <ins>Allocation shall be
4493 performed "as if" by calling the <code>allocate()</code> member
4494 function on a copy of the allocator object of the appropriate type
4495 <sup>New Footnote)</sup>, and deallocation "as if" by calling
4496 <code>deallocate()</code> on a copy of the same allocator object of
4497 the corresponding type.</ins>
4499 <ins>A copy of this argument shall also be used to construct and
4500 destroy objects whose lifetime is managed by the container, including
4501 but not limited to those of the container's <code>value_type</code>,
4502 and to obtain their address. All objects residing in storage
4503 allocated by a container's allocator shall be constructed "as if" by
4504 calling the <code>construct()</code> member function on a copy of the
4505 allocator object of the appropriate type. The same objects shall be
4506 destroyed "as if" by calling <code>destroy()</code> on a copy of the
4507 same allocator object of the same type. The address of such objects
4508 shall be obtained "as if" by calling the <code>address()</code> member
4509 function on a copy of the allocator object of the appropriate
4512 <ins>Finally, a copy of this argument shall be used by its container
4513 object to determine the maximum number of objects of the container's
4514 <code>value_type</code> the container may store at the same time. The
4515 container member function <code>max_size()</code> obtains this number
4516 from the value returned by a call to
4517 <code>get_allocator().max_size()</code>.</ins>
4519 In all container types defined in this clause <ins>that are
4520 parametrized on <code>Allocator</code></ins>, the member
4521 <code>get_allocator()</code> returns a copy of the
4522 <code>Allocator</code> object used to construct the
4523 container.<sup>258)</sup>
4526 New Footnote: This type may be different from <code>Allocator</code>:
4527 it may be derived from <code>Allocator</code> via
4528 <code>Allocator::rebind<U>::other</code> for the appropriate
4529 type <code>U</code>.
4534 The proposed wording seems cumbersome but I couldn't think of a better
4535 way to describe the requirement that containers use their
4536 <code>Allocator</code> to manage only objects (regardless of their
4537 type) that persist over their lifetimes and not, for example,
4538 temporaries created on the stack. That is, containers shouldn't be
4539 required to call <code>Allocator::construct(Allocator::allocate(1),
4540 elem)</code> just to construct a temporary copy of an element, or
4541 <code>Allocator::destroy(Allocator::address(temp), 1)</code> to
4542 destroy temporaries.
4548 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>.
4553 post Oxford: This would be rendered NAD Editorial by acceptance of
4554 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2257.html">N2257</a>.
4562 <h3><a name="588"></a>588. requirements on zero sized tr1::arrays and other details</h3>
4563 <p><b>Section:</b> 23.3.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD">Tentatively NAD</a>
4564 <b>Submitter:</b> Gennaro Prota <b>Opened:</b> 2006-07-18 <b>Last modified:</b> 2009-07-15</p>
4565 <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>
4566 <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>
4567 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20NAD">Tentatively NAD</a> status.</p>
4568 <p><b>Discussion:</b></p>
4570 The wording used for section 23.2.1 [lib.array] seems to be subtly
4571 ambiguous about zero sized arrays (N==0). Specifically:
4574 * "An instance of array<T, N> stores N elements of type T, so that
4578 Does this imply that a zero sized array object stores 0 elements, i.e.
4579 that it cannot store any element of type T? The next point clarifies
4580 the rationale behind this question, basically how to implement begin()
4584 * 23.2.1.5 [lib.array.zero], p2: "In the case that N == 0, begin() ==
4585 end() == unique value."
4588 What does "unique" mean in this context? Let's consider the following
4589 possible implementations, all relying on a partial specialization:
4592 template< typename T >
4593 class array< T, 0 > {
4598 { return iterator( reinterpret_cast< T * >( this ) ); }
4604 This has been used in boost, probably intending that the return value
4605 had to be unique to the specific array object and that array couldn't
4606 store any T. Note that, besides relying on a reinterpret_cast, has
4607 (more than potential) alignment problems.
4610 template< typename T >
4611 class array< T, 0 > {
4616 { return iterator( &t ); }
4622 This provides a value which is unique to the object and to the type of
4623 the array, but requires storing a T. Also, it would allow the user to
4624 mistakenly provide an initializer list with one element.
4627 A slight variant could be returning *the* null pointer of type T
4629 <blockquote><pre> return static_cast<T*>(0);
4632 In this case the value would be unique to the type array<T, 0> but not
4633 to the objects (all objects of type array<T, 0> with the same value
4634 for T would yield the same pointer value).
4637 Furthermore this is inconsistent with what the standard requires from
4638 allocation functions (see library issue 9).
4641 c) same as above but with t being a static data member; again, the
4642 value would be unique to the type, not to the object.
4645 d) to avoid storing a T *directly* while disallowing the possibility
4646 to use a one-element initializer list a non-aggregate nested class
4649 <blockquote><pre> struct holder { holder() {} T t; } h;
4652 and then begin be defined as
4654 <blockquote><pre> iterator begin() { return &h.t; }
4657 But then, it's arguable whether the array stores a T or not.
4661 -----------------------------------------------------
4664 Now, on different issues:
4667 * what's the effect of calling assign(T&) on a zero-sized array? There
4668 seems to be only mention of front() and back(), in 23.2.1 [lib.array]
4669 p4 (I would also suggest to move that bullet to section 23.2.1.5
4670 [lib.array.zero], for locality of reference)
4673 * (minor) the opening paragraph of 23.2.1 [lib.array] wording is a bit
4674 inconsistent with that of other sequences: that's not a problem in
4675 itself, but compare it for instance with "A vector is a kind of
4676 sequence that supports random access iterators"; though the intent is
4677 obvious one might argue that the wording used for arrays doesn't tell
4678 what an array is, and relies on the reader to infer that it is what
4679 the <array> header defines.
4682 * it would be desiderable to have a static const data member of type
4683 std::size_t, with value N, for usage as integral constant expression
4686 * section 23.1 [lib.container.requirements] seem not to consider
4687 fixed-size containers at all, as it says: "[containers] control
4688 allocation and deallocation of these objects [the contained objects]
4689 through constructors, destructors, *insert and erase* operations"
4692 * max_size() isn't specified: the result is obvious but, technically,
4693 it relies on table 80: "size() of the largest possible container"
4694 which, again, doesn't seem to consider fixed size containers
4698 2009-05-29 Daniel adds:
4706 star bullet 1 ("what's the effect of calling <tt>assign(T&)</tt> on a
4707 zero-sized array?[..]");
4710 <tt>assign</tt> has been renamed to <tt>fill</tt> and the semantic of <tt>fill</tt> is now
4712 the free algorithm <tt>fill_n</tt>, which is well-defined for this situation.
4717 star bullet 3 ("it would be desiderable to have a static const data
4721 It seems that <tt>tuple_size<array<T, N> >::value</tt> as of 23.3.1.7 [array.tuple] does
4722 provide this functionality now.
4735 Alisdair to address by the next meeting, or declare NAD.
4738 Moved to Tentatively NAD.
4744 <p><b>Proposed resolution:</b></p>
4750 Kona (2007): requirements on zero sized <tt>tr1::array</tt>s and other details
4751 Issue 617: <tt>std::array</tt> is a sequence that doesn't satisfy the sequence
4752 requirements? Alisdair will prepare a paper. Proposed Disposition: Open
4760 <h3><a name="594"></a>594. Disadvantages of defining Swappable in terms of CopyConstructible and Assignable</h3>
4761 <p><b>Section:</b> X [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
4762 <b>Submitter:</b> Niels Dekker <b>Opened:</b> 2006-11-02 <b>Last modified:</b> 2009-07-26</p>
4763 <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>
4764 <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>
4765 <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>
4766 <p><b>Discussion:</b></p>
4768 It seems undesirable to define the Swappable requirement in terms of
4769 CopyConstructible and Assignable requirements. And likewise, once the
4770 MoveConstructible and MoveAssignable requirements (N1860) have made it
4771 into the Working Draft, it seems undesirable to define the Swappable
4772 requirement in terms of those requirements. Instead, it appears
4773 preferable to have the Swappable requirement defined exclusively in
4774 terms of the existence of an appropriate swap function.
4777 Section 20.1.4 [lib.swappable] of the current Working Draft (N2009)
4781 The Swappable requirement is met by satisfying one or more of the
4782 following conditions:</p>
4785 T is Swappable if T satisfies the CopyConstructible requirements
4786 (20.1.3) and the Assignable requirements (23.1);
4789 T is Swappable if a namespace scope function named swap exists in the
4790 same namespace as the definition of T, such that the expression
4791 swap(t,u) is valid and has the semantics described in Table 33.
4795 I can think of three disadvantages of this definition:
4798 If a client's type T satisfies the first condition (T is both
4799 CopyConstructible and Assignable), the client cannot stop T from
4800 satisfying the Swappable requirement without stopping T from
4801 satisfying the first condition.
4803 A client might want to stop T from satisfying the Swappable
4804 requirement, because swapping by means of copy construction and
4805 assignment might throw an exception, and she might find a throwing
4806 swap unacceptable for her type. On the other hand, she might not feel
4807 the need to fully implement her own swap function for this type. In
4808 this case she would want to be able to simply prevent algorithms that
4809 would swap objects of type T from being used, e.g., by declaring a
4810 swap function for T, and leaving this function purposely undefined.
4811 This would trigger a link error, if an attempt would be made to use
4812 such an algorithm for this type. For most standard library
4813 implementations, this practice would indeed have the effect of
4814 stopping T from satisfying the Swappable requirement.
4818 A client's type T that does not satisfy the first condition can not be
4819 made Swappable by providing a specialization of std::swap for T.
4821 While I'm aware about the fact that people have mixed feelings about
4822 providing a specialization of std::swap, it is well-defined to do so.
4823 It sounds rather counter-intuitive to say that T is not Swappable, if
4824 it has a valid and semantically correct specialization of std::swap.
4825 Also in practice, providing such a specialization will have the same
4826 effect as satisfying the Swappable requirement.
4830 For a client's type T that satisfies both conditions of the Swappable
4831 requirement, it is not specified which of the two conditions prevails.
4832 After reading section 20.1.4 [lib.swappable], one might wonder whether
4833 objects of T will be swapped by doing copy construction and
4834 assignments, or by calling the swap function of T.
4836 I'm aware that the intention of the Draft is to prefer calling the
4837 swap function of T over doing copy construction and assignments. Still
4838 in my opinion, it would be better to make this clear in the wording of
4839 the definition of Swappable.
4844 I would like to have the Swappable requirement defined in such a way
4845 that the following code fragment will correctly swap two objects of a
4846 type T, if and only if T is Swappable:
4848 <pre> using std::swap;
4849 swap(t, u); // t and u are of type T.
4852 This is also the way Scott Meyers recommends calling a swap function,
4853 in Effective C++, Third Edition, item 25.
4856 Most aspects of this issue have been dealt with in a discussion on
4857 comp.std.c++ about the Swappable requirement, from 13 September to 4
4858 October 2006, including valuable input by David Abrahams, Pete Becker,
4859 Greg Herlihy, Howard Hinnant and others.
4868 Recommend NAD. Solved by
4869 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2774.pdf">N2774</a>.
4878 Moved to Open. Waiting for non-concepts draft.
4882 <p><b>Proposed resolution:</b></p>
4884 Change section 20.1.4 [lib.swappable] as follows:
4887 The Swappable requirement is met by satisfying
4888 <del>one or more of the following conditions:</del>
4889 <ins>the following condition:</ins></p>
4893 <del>T is Swappable if T satisfies the CopyConstructible requirements
4894 (20.1.3) and the Assignable requirements (23.1);</del>
4898 T is Swappable if a namespace scope function named swap exists in the
4899 same namespace as the definition of T, such that the expression
4900 swap(t,u) is valid and has the semantics described in Table 33.
4902 T is Swappable if an unqualified function call swap(t,u) is valid
4903 within the namespace std, and has the semantics described in Table 33.
4913 <h3><a name="617"></a>617. std::array is a sequence that doesn't satisfy the sequence requirements?</h3>
4914 <p><b>Section:</b> 23.3.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD">Tentatively NAD</a>
4915 <b>Submitter:</b> Bo Persson <b>Opened:</b> 2006-12-30 <b>Last modified:</b> 2009-07-16</p>
4916 <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>
4917 <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>
4918 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20NAD">Tentatively NAD</a> status.</p>
4919 <p><b>Discussion:</b></p>
4921 The <tt><array></tt> header is given under 23.3 [sequences].
4922 23.3.1 [array]/paragraph 3 says:
4925 "Unless otherwise specified, all array operations are as described in
4926 23.2 [container.requirements]".
4929 However, array isn't mentioned at all in section 23.2 [container.requirements].
4930 In particular, Table 82 "Sequence requirements" lists several operations (insert, erase, clear)
4931 that std::array does not have in 23.3.1 [array].
4934 Also, Table 83 "Optional sequence operations" lists several operations that
4935 std::array does have, but array isn't mentioned.
4945 The real issue seems to be different than what is described here.
4946 Non-normative text says that std::array is a sequence container, but
4947 there is disagreement about what that really means. There are two
4948 possible interpretations:
4952 a sequence container is one that satisfies all sequence container requirements
4955 a sequence container is one that satisfies some of the sequence
4956 container requirements. Any operation that the container supports is
4957 specified by one or more sequence container requirements, unless that
4958 operation is specifically singled out and defined alongside the
4959 description of the container itself.
4963 Move to Tentatively NAD.
4968 2009-07-15 Loïc Joly adds:
4974 The section 23.2.3 [sequence.reqmts]/1 states that array is a sequence. 23.2.3 [sequence.reqmts]/3
4975 introduces table 83, named Sequence container requirements. This seems
4976 to me to be defining the requirements for all sequences. However, array
4977 does not follow all of this requirements (this can be read in the array
4978 specific section, for the standard is currently inconsistent).
4982 Proposed resolution 1 (minimal change):
4986 Say that array is a container, that in addition follows only some of the
4987 sequence requirements, as described in the array section:
4991 The library provides <del>five</del> <ins>three</ins> basic kinds of sequence containers: <del><tt>array</tt></del>,
4993 <del><tt>forward_list</tt></del>, <tt>list</tt>, and <tt>deque</tt>. <ins>In addition, <tt>array</tt>
4994 and <tt>forward_list</tt> follows some of the requirements
4995 of sequences, as described in their respective sections.</ins>
5001 Proposed resolution 2 (most descriptive description, no full wording provided):
5004 Introduce the notion of a Fixed Size Sequence, with it requirement table
5005 that would be a subset of the current Sequence container. array would be
5006 the only Fixed Size Sequence (but dynarray is in the queue for TR2).
5007 Sequence requirements would now be requirements in addition to Fixed
5008 Size Sequence requirements (it is currently in addition to container).
5018 Move to NAD Editorial
5023 <p><b>Proposed resolution:</b></p>
5032 <h3><a name="625"></a>625. mixed up <i>Effects</i> and <i>Returns</i> clauses</h3>
5033 <p><b>Section:</b> 17 [library] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD">Tentatively NAD</a>
5034 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2007-01-20 <b>Last modified:</b> 2009-07-15</p>
5035 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#library">active issues</a> in [library].</p>
5036 <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>
5037 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20NAD">Tentatively NAD</a> status.</p>
5038 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#895">895</a></p>
5039 <p><b>Discussion:</b></p>
5042 Many member functions of <code>basic_string</code> are overloaded,
5043 with some of the overloads taking a <code>string</code> argument,
5044 others <code>value_type*</code>, others <code>size_type</code>, and
5045 others still <code>iterators</code>. Often, the requirements on one of
5046 the overloads are expressed in the form of <i>Effects</i>,
5047 <i>Throws</i>, and in the Working Paper
5048 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2134.pdf">N2134</a>)
5049 also <i>Remark</i> clauses, while those on the rest of the overloads
5050 via a reference to this overload and using a <i>Returns</i> clause.
5054 The difference between the two forms of specification is that per
5055 17.5.1.4 [structure.specifications], p3, an <i>Effects</i> clause specifies
5056 <i>"actions performed by the functions,"</i> i.e., its observable
5057 effects, while a <i>Returns</i> clause is <i>"a description of the
5058 return value(s) of a function"</i> that does not impose any
5059 requirements on the function's observable effects.
5063 Since only <i>Notes</i> are explicitly defined to be informative and
5064 all other paragraphs are explicitly defined to be normative, like
5065 <i>Effects</i> and <i>Returns</i>, the new <i>Remark</i> clauses also
5066 impose normative requirements.
5070 So by this strict reading of the standard there are some member
5071 functions of <code>basic_string</code> that are required to throw an
5072 exception under some conditions or use specific traits members while
5073 many other otherwise equivalent overloads, while obliged to return the
5074 same values, aren't required to follow the exact same requirements
5075 with regards to the observable effects.
5079 Here's an example of this problem that was precipitated by the change
5080 from informative Notes to normative <i>Remark</i>s (presumably made to
5081 address <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#424">424</a>):
5085 In the Working Paper, <code>find(string, size_type)</code> contains a
5086 <i>Remark</i> clause (which is just a <i>Note</i> in the current
5087 standard) requiring it to use <code>traits::eq()</code>.
5091 <code>find(const charT *s, size_type pos)</code> is specified to
5092 return <code>find(string(s), pos)</code> by a <i>Returns</i> clause
5093 and so it is not required to use <code>traits::eq()</code>. However,
5094 the Working Paper has replaced the original informative <i>Note</i>
5095 about the function using <code>traits::length()</code> with a
5096 normative requirement in the form of a <i>Remark</i>. Calling
5097 <code>traits::length()</code> may be suboptimal, for example when the
5098 argument is a very long array whose initial substring doesn't appear
5099 anywhere in <code>*this</code>.
5103 Here's another similar example, one that existed even prior to the
5104 introduction of <i>Remark</i>s:
5108 <code> insert(size_type pos, string, size_type, size_type)</code> is
5109 required to throw <code>out_of_range</code> if <code>pos >
5114 <code>insert(size_type pos, string str)</code> is specified to return
5115 <code>insert(pos, str, 0, npos)</code> by a <i>Returns</i> clause and
5116 so its effects when <code>pos > size()</code> are strictly speaking
5121 I believe a careful review of the current <i>Effects</i> and
5122 <i>Returns</i> clauses is needed in order to identify all such
5123 problematic cases. In addition, a review of the Working Paper should
5124 be done to make sure that the newly introduced normative <i>Remark</i>
5125 clauses do not impose any undesirable normative requirements in place
5126 of the original informative <i>Notes</i>.
5130 Batavia: Alan and Pete to work.
5135 Bellevue: Marked as NAD Editorial.
5140 Post-Sophia Antipolis:
5141 Martin indicates there is still work to be done on this issue.
5151 Tom proposes we say that, unless specified otherwise,
5152 it is always the caller's responsibility to verify that supplied arguments
5153 meet the called function's requirements.
5154 If further semantics are specified
5155 (e.g., that the function throws under certain conditions),
5156 then it is up to the implementer to check those conditions.
5157 Alan feels strongly that our current use of Requires in this context
5158 is confusing, especially now that <tt>requires</tt> is a new keyword.
5167 Move to Tentatively NAD.
5172 <p><b>Proposed resolution:</b></p>
5181 <h3><a name="630"></a>630. arrays of valarray</h3>
5182 <p><b>Section:</b> 26.6.2.1 [valarray.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
5183 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2007-01-28 <b>Last modified:</b> 2009-07-15</p>
5184 <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>
5185 <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>
5186 <p><b>Discussion:</b></p>
5189 Section 26.2 [numeric.requirements], p1 suggests that a
5190 <code>valarray</code> specialization on a type <code>T</code> that
5191 satisfies the requirements enumerated in the paragraph is itself a
5192 valid type on which <code>valarray</code> may be instantiated
5193 (Footnote 269 makes this clear). I.e.,
5194 <code>valarray<valarray<T> ></code> is valid as long as
5195 <code>T</code> is valid. However, since implementations of
5196 <code>valarray</code> are permitted to initialize storage allocated by
5197 the class by invoking the default ctor of <code>T</code> followed by
5198 the copy assignment operator, such implementations of
5199 <code>valarray</code> wouldn't work with (perhaps user-defined)
5200 specializations of <code>valarray</code> whose assignment operator had
5201 undefined behavior when the size of its argument didn't match the size
5202 of <code>*this</code>. By <i>"wouldn't work"</i> I mean that it would
5203 be impossible to resize such an array of arrays by calling the
5204 <code>resize()</code> member function on it if the function used the
5205 copy assignment operator after constructing all elements using the
5206 default ctor (e.g., by invoking <code>new value_type[N]</code>) to
5207 obtain default-initialized storage) as it's permitted to do.
5212 Stated more generally, the problem is that
5213 <code>valarray<valarray<T> >::resize(size_t)</code> isn't
5214 required or guaranteed to have well-defined semantics for every type
5215 <code>T</code> that satisfies all requirements in
5216 26.2 [numeric.requirements].
5221 I believe this problem was introduced by the adoption of the
5222 resolution outlined in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1996/N0857.asc">N0857</a>,
5223 <i>Assignment of valarrays</i>, from 1996. The copy assignment
5224 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>,
5225 as well as the one proposed in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0308.asc">N0308</a>
5226 (both from 1993), had well-defined semantics for arrays of unequal
5227 size (the latter explicitly only when <code>*this</code> was empty;
5228 assignment of non empty arrays of unequal size was a runtime error).
5233 The justification for the change given in N0857 was the "loss of
5234 performance [deemed] only significant for very simple operations on
5235 small arrays or for architectures with very few registers."
5240 Since tiny arrays on a limited subset of hardware architectures are
5241 likely to be an exceedingly rare case (despite the continued
5242 popularity of x86) I propose to revert the resolution and make the
5243 behavior of all <code>valarray</code> assignment operators
5244 well-defined even for non-conformal arrays (i.e., arrays of unequal
5245 size). I have implemented this change and measured no significant
5246 degradation in performance in the common case (non-empty arrays of
5247 equal size). I have measured a 50% (and in some cases even greater)
5248 speedup in the case of assignments to empty arrays versus calling
5249 <code>resize()</code> first followed by an invocation of the copy
5250 assignment operator.
5260 If no proposed wording by June meeting, this issue should be closed NAD.
5270 Move resolution 1 to Ready.
5273 Howard: second resolution has been commented out (made invisible).
5274 Can be brought back on demand.
5280 <p><b>Proposed resolution:</b></p>
5283 Change 26.6.2.2 [valarray.assign], p1 as follows:
5290 valarray<T>& operator=(const valarray<T>&<ins> x</ins>);
5296 -1- Each element of the <code>*this</code> array is assigned the value
5297 of the corresponding element of the argument array. <del>The
5298 resulting behavior is undefined if </del><ins>When </ins>the length of
5299 the argument array is not equal to the length of the *this
5300 array<del>.</del><ins> resizes <code>*this</code> to make the two
5301 arrays the same length, as if by calling
5302 <code>resize(x.size())</code>, before performing the assignment.</ins>
5308 And add a new paragraph just below paragraph 1 with the following
5315 <ins>-2- <i>Postcondition</i>: <code>size() == x.size()</code>.</ins>
5321 Also add the following paragraph to 26.6.2.2 [valarray.assign], immediately after p4:
5327 <ins>-?- When the length, <i><code>N</code></i> of the array referred
5328 to by the argument is not equal to the length of <code>*this</code>,
5329 the operator resizes <code>*this</code> to make the two arrays the
5330 same length, as if by calling <code>resize(<i>N</i>)</code>, before
5331 performing the assignment.</ins>
5337 pre-Sophia Antipolis, Martin adds the following compromise wording, but
5338 prefers the original proposed resolution:
5347 Kona (2007): Gaby to propose wording for an alternative resolution in
5348 which you can assign to a <tt>valarray</tt> of size 0, but not to any other
5349 <tt>valarray</tt> whose size is unequal to the right hand side of the assignment.
5357 <h3><a name="631"></a>631. conflicting requirements for <tt>BinaryPredicate</tt></h3>
5358 <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>
5359 <b>Submitter:</b> James Kanze <b>Opened:</b> 2007-01-31 <b>Last modified:</b> 2009-07-28</p>
5360 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#algorithms">active issues</a> in [algorithms].</p>
5361 <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>
5362 <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>
5363 <p><b>Discussion:</b></p>
5365 The general requirements for <tt><tt>BinaryPredicate</tt></tt> (in 25 [algorithms]/8) contradict the implied specific requirements for
5366 some functions. In particular, it says that:
5370 [...] if an algorithm takes <tt>BinaryPredicate <i>binary_pred</i></tt>
5371 as its argument and <tt><i>first1</i></tt> and <i>first2</i> as its
5372 iterator arguments, it should work correctly in the construct <tt>if
5373 (binary_pred (*<i>first1</i> , *<i>first2</i> )){...}</tt>.
5374 <tt>BinaryPredicate</tt> always takes the first iterator type as its
5375 first argument, that is, in those cases when <tt>T <i>value</i></tt> is
5376 part of the signature, it should work correctly in the context of <tt>if
5377 (binary_pred (*<i>first1</i> , <i>value</i>)){...}</tt>.
5381 In the description of <tt>upper_bound</tt> (25.5.3.2 [upper.bound]/2), however, the use is described as
5382 "<tt>!comp(<i>value</i>, <i>e</i>)</tt>", where <tt><i>e</i></tt> is an
5383 element of the sequence (a result of dereferencing
5384 <tt>*<i>first</i></tt>).
5388 In the description of <tt>lexicographical_compare</tt>, we have both
5389 "<tt>*<i>first1</i> < *<i>first2</i></tt>" and "<tt>*<i>first2</i>
5390 < *<i>first1</i></tt>" (which presumably implies "<tt>comp(
5391 *<i>first1</i>, *<i>first2</i> )</tt>" and "<tt>comp( *<i>first2</i>,
5392 *<i>first1</i> )</tt>".
5396 Toronto: Moved to Open. ConceptGCC seems to get <tt>lower_bound</tt>
5397 and <tt>upper_bound</tt> to work withoutt these changes.
5402 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
5408 <p><b>Proposed resolution:</b></p>
5410 Logically, the <tt>BinaryPredicate</tt> is used as an ordering
5411 relationship, with the semantics of "less than". Depending on the
5412 function, it may be used to determine equality, or any of the inequality
5413 relationships; doing this requires being able to use it with either
5414 parameter first. I would thus suggest that the requirement be:
5418 [...] <tt>BinaryPredicate</tt> always takes the first iterator
5419 <tt>value_type</tt> as one of its arguments, it is unspecified which. If
5420 an algorithm takes <tt>BinaryPredicate <i>binary_pred</i></tt> as its
5421 argument and <tt><i><i>first1</i></i></tt> and <i>first2</i> as its
5422 iterator arguments, it should work correctly both in the construct
5423 <tt>if (binary_pred (*<i>first1</i> , *<i>first2</i> )){...}</tt> and
5424 <tt>if (binary_pred (*<i>first2</i>, *<i>first1</i>)){...}</tt>. In
5425 those cases when <tt>T <i>value</i></tt> is part of the signature, it
5426 should work correctly in the context of <tt>if (binary_pred
5427 (*<i>first1</i> , <i>value</i>)){...}</tt> and of <tt>if (binary_pred
5428 (<i>value</i>, *<i>first1</i>)){...}</tt>. [<i>Note:</i> if the two
5429 types are not identical, and neither is convertable to the other, this
5430 may require that the <tt>BinaryPredicate</tt> be a functional object
5431 with two overloaded <tt>operator()()</tt> functions. <i>--end note</i>]
5435 Alternatively, one could specify an order for each function. IMHO, this
5436 would be more work for the committee, more work for the implementors,
5437 and of no real advantage for the user: some functions, such as
5438 <tt>lexicographical_compare</tt> or <tt>equal_range</tt>, will still require both
5439 functions, and it seems like a much easier rule to teach that both
5440 functions are always required, rather than to have a complicated list of
5441 when you only need one, and which one.
5445 <p><b>Rationale:</b></p>
5453 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/N2759.pdf">N2759</a>.
5462 <h3><a name="635"></a>635. domain of <tt>allocator::address</tt></h3>
5463 <p><b>Section:</b> X [allocator.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
5464 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2007-02-08 <b>Last modified:</b> 2009-07-28</p>
5465 <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>
5466 <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>
5467 <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>
5468 <p><b>Discussion:</b></p>
5470 The table of allocator requirements in X [allocator.requirements] describes
5471 <tt>allocator::address</tt> as:
5473 <blockquote><pre>a.address(r)
5477 where <tt>r</tt> and <tt>s</tt> are described as:
5480 a value of type <tt>X::reference</tt> obtained by the expression <tt>*p</tt>.
5488 a value of type <tt>X::pointer</tt>, obtained by calling <tt>a1.allocate</tt>,
5489 where <tt>a1 == a</tt>
5493 This all implies that to get the address of some value of type <tt>T</tt> that
5494 value must have been allocated by this allocator or a copy of it.
5498 However sometimes container code needs to compare the address of an external value of
5499 type <tt>T</tt> with an internal value. For example <tt>list::remove(const T& t)</tt>
5500 may want to compare the address of the external value <tt>t</tt> with that of a value
5501 stored within the list. Similarly <tt>vector</tt> or <tt>deque insert</tt> may
5502 want to make similar comparisons (to check for self-referencing calls).
5506 Mandating that <tt>allocator::address</tt> can only be called for values which the
5507 allocator allocated seems overly restrictive.
5516 Pablo recommends NAD Editorial, solved by
5517 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2768.pdf">N2768</a>.
5521 2009-04-28 Pablo adds:
5526 Tentatively-ready NAD Editorial as fixed by
5527 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2768.pdf">N2768</a>.
5540 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
5546 <p><b>Proposed resolution:</b></p>
5548 Change X [allocator.requirements]:
5553 <tt>r</tt> : a value of type <tt>X::reference</tt> <del>obtained by the expression *p</del>.
5556 <tt>s</tt> : a value of type <tt>X::const_reference</tt> <del>obtained by the
5557 expression <tt>*q</tt> or by conversion from a value <tt>r</tt></del>.
5562 post Oxford: This would be rendered NAD Editorial by acceptance of
5563 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2257.html">N2257</a>.
5568 Kona (2007): This issue is section 8 of N2387. There was some discussion of it but
5569 no resolution to this issue was recorded. Moved to Open.
5579 <h3><a name="659"></a>659. istreambuf_iterator should have an operator->()</h3>
5580 <p><b>Section:</b> 24.6.3 [istreambuf.iterator] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
5581 <b>Submitter:</b> Niels Dekker <b>Opened:</b> 2007-03-25 <b>Last modified:</b> 2009-07-15</p>
5582 <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>
5583 <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>
5584 <p><b>Discussion:</b></p>
5586 Greg Herlihy has clearly demonstrated that a user defined input
5587 iterator should have an operator->(), even if its
5588 value type is a built-in type (comp.std.c++, "Re: Should any iterator
5589 have an operator->() in C++0x?", March 2007). And as Howard
5590 Hinnant remarked in the same thread that the input iterator
5591 <tt>istreambuf_iterator</tt> doesn't have one, this must be a
5595 Based on Greg's example, the following code demonstrates the issue:
5596 </p><pre> #include <iostream>
5597 #include <fstream>
5598 #include <streambuf>
5603 std::ifstream s("filename", std::ios::in);
5604 std::istreambuf_iterator<char> i(s);
5606 (*i).~C(); // This is well-formed...
5607 i->~C(); // ... so this should be supported!
5612 Of course, operator-> is also needed when the value_type of
5613 istreambuf_iterator is a class.
5616 The operator-> could be implemented in various ways. For instance,
5617 by storing the current value inside the iterator, and returning its
5618 address. Or by returning a proxy, like operator_arrow_proxy, from
5619 <a href="http://www.boost.org/boost/iterator/iterator_facade.hpp">http://www.boost.org/boost/iterator/iterator_facade.hpp</a>
5622 I hope that the resolution of this issue will contribute to getting a
5623 clear and consistent definition of iterator concepts.
5627 Kona (2007): The proposed resolution is inconsistent because the return
5628 type of <tt>istreambuf_iterator::operator->()</tt> is specified to be <tt>pointer</tt>,
5629 but the proposed text also states that "<tt>operator-></tt> may return a proxy."
5634 Niels Dekker (mailed to Howard Hinnant):
5639 The proposed resolution does
5640 not seem inconsistent to me. <tt>istreambuf_iterator::operator->()</tt> should
5641 have <tt>istreambuf_iterator::pointer</tt> as return type, and this return type
5642 may in fact be a proxy.
5645 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>
5646 unspecified for some iterator categories") implies that for any iterator
5647 class <tt>Iter</tt>, the return type of <tt>operator->()</tt> is <tt>Iter::pointer</tt>, by
5648 definition. I don't think <tt>Iter::pointer</tt> needs to be a raw pointer.
5651 Still I wouldn't mind if the text "<tt>operator-></tt> may return a proxy" would
5652 be removed from the resolution. I think it's up to the library
5653 implementation, how to implement <tt>istreambuf_iterator::operator->()</tt>. As
5654 longs as it behaves as expected: <tt>i->m</tt> should have the same effect as
5655 <tt>(*i).m</tt>. Even for an explicit destructor call, <tt>i->~C()</tt>. The main issue
5656 is just: <tt>istreambuf_iterator</tt> should have an <tt>operator->()</tt>!
5661 2009-04-30 Alisdair adds:
5666 Note that operator-> is now a requirement in the <tt>InputIterator</tt> concept, so
5667 this issue cannot be ignored or existing valid programs will break when
5668 compiled with an 0x library.
5672 2009-05-29 Alisdair adds:
5678 I agree with the observation that in principle the type 'pointer' may be a
5679 proxy, and the words highlighting this are redundant.
5682 However, in the current draught <tt>pointer</tt> is required to be exactly '<tt>charT *</tt>'
5683 by the derivation from <tt>std::iterator</tt>. At a minimum, the 4th parameter of
5684 this base class template should become unspecified. That permits the
5685 introduction of a proxy as a nested class in some further undocumented (not
5686 even exposition-only) base.
5689 It also permits the <tt>istream_iterator</tt> approach where the cached value is
5690 stored in the iterator itself, and the iterator serves as its own proxy for
5691 post-increment <tt>operator++</tt> - removing the need for the existing
5692 exposition-only nested class <tt>proxy</tt>.
5695 Note that the current <tt>proxy</tt> class also has exactly the right properties to
5696 serve as the pointer <tt>proxy</tt> too. This is likely to be a common case where an
5697 <tt>InputIterator</tt> does not hold internal state but delegates to another class.
5700 Proposed Resolution:
5703 In addition to the current proposal:
5706 24.6.3 [istreambuf.iterator]
5708 <blockquote><pre>template<class charT, class traits = char_traits<charT> >
5709 class istreambuf_iterator
5710 : public iterator<input_iterator_tag, charT,
5711 typename traits::off_type, <del>charT*</del> <ins><i>unspecified</i></ins>, charT> {
5722 Move the additional part into the proposed resolution, and wrap the
5723 descriptive text in a Note.
5725 <p><i>[Howard: done.]</i></p>
5734 <p><b>Proposed resolution:</b></p>
5736 Add to the synopsis in 24.6.3 [istreambuf.iterator]:
5739 <blockquote><pre>charT operator*() const;
5740 <ins>pointer operator->() const;</ins>
5741 istreambuf_iterator<charT,traits>& operator++();
5745 24.6.3 [istreambuf.iterator]
5748 <blockquote><pre>template<class charT, class traits = char_traits<charT> >
5749 class istreambuf_iterator
5750 : public iterator<input_iterator_tag, charT,
5751 typename traits::off_type, <del>charT*</del> <ins><i>unspecified</i></ins>, charT> {
5755 Change 24.6.3 [istreambuf.iterator], p1:
5759 The class template <tt>istreambuf_iterator</tt> reads successive
5760 characters from the <tt>streambuf</tt> for which it was constructed.
5761 <tt>operator*</tt> provides access to the current input character, if
5762 any. <ins>[<i>Note:</i> <tt>operator-></tt> may return a proxy. —
5763 <i>end note</i>]</ins> Each time
5764 <tt>operator++</tt> is evaluated, the iterator advances to the next
5765 input character. If the end of stream is reached
5766 (<tt>streambuf_type::sgetc()</tt> returns <tt>traits::eof()</tt>), the
5767 iterator becomes equal to the end of stream iterator value. The default
5768 constructor <tt>istreambuf_iterator()</tt> and the constructor
5769 <tt>istreambuf_iterator(0)</tt> both construct an end of stream iterator
5770 object suitable for use as an end-of-range.
5780 <h3><a name="668"></a>668. <tt>money_get</tt>'s empty minus sign</h3>
5781 <p><b>Section:</b> 22.4.6.1.2 [locale.money.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
5782 <b>Submitter:</b> Thomas Plum <b>Opened:</b> 2007-04-16 <b>Last modified:</b> 2009-07-20</p>
5783 <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>
5784 <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>
5785 <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>
5786 <p><b>Discussion:</b></p>
5788 22.4.6.1.2 [locale.money.get.virtuals], para 3 says:
5792 If <tt>pos</tt> or <tt>neg</tt> is empty, the sign component is
5793 optional, and if no sign is detected, the result is given the sign
5794 that corresponds to the source of the empty string.
5798 The following objection has been raised:
5802 A <tt>negative_sign</tt> of "" means "there is no
5803 way to write a negative sign" not "any null sequence is a negative
5804 sign, so it's always there when you look for it".
5808 [Plum ref _222612Y32]
5812 Kona (2007): Bill to provide proposed wording and interpretation of existing wording.
5817 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#669">669</a>.
5821 2009-05-17 Howard adds:
5827 I disagree that a <tt>negative_sign</tt> of "" means "there is no
5829 write a negative sign". The meaning requires the sentences of
5830 22.4.6.1.2 [locale.money.get.virtuals] p3 following that quoted above
5836 -3- ... If <tt>pos</tt> or <tt>neg</tt> is empty, the sign component is
5837 optional, and if no sign is detected, the result is given the sign that
5838 corresponds to the source of the empty string. Otherwise, the character
5839 in the indicated position must match the first character of <tt>pos</tt>
5840 or <tt>neg</tt>, and the result is given the corresponding sign. If the
5841 first character of <tt>pos</tt> is equal to the first character of
5842 <tt>neg</tt>, or if both strings are empty, the result is given a
5847 So a <tt>negative_sign</tt> of "" means "there is no way to write a
5848 negative sign" only when <tt>positive_sign</tt> is also "". However
5849 when <tt>negative_sign</tt> is "" and <tt>postive_sign.size() >
5850 0</tt>, then one writes a negative value by not writing the
5851 <tt>postive_sign</tt> in the position indicated by
5852 <tt>money_base::sign</tt>.
5856 <blockquote><pre>pattern = {symbol, sign, value, none}
5859 $123 // a negative value, using optional sign
5860 $+123 // a positive value
5861 $-123 // a parse error
5868 <blockquote><pre>pattern = {symbol, sign, value, none}
5871 $123 // a positive value, no sign possible
5872 $+123 // a parse error
5873 $-123 // a parse error
5878 And (regarding <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#669">669</a>):
5881 <blockquote><pre>pattern = {symbol, sign, value, none}
5884 $123 // a parse error, sign is mandatory
5885 $+123 // a parse error
5886 $-123 // a positive value
5891 The text seems both unambiguous and clear to me. I recommend NAD for
5892 both this issue and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#669">669</a>. However I would have no
5893 objection to adding examples such as those above.
5903 This discussion applies equally to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#669">669</a> (q.v.).
5904 Howard has added examples above,
5905 and recommends either NAD or a resolution that adds his (or similar) examples
5906 to the Working Paper.
5909 Alan would like to rewrite paragraph 3.
5912 We recommend moving to NAD.
5913 Anyone who feels strongly about adding the examples
5914 is invited to submit corresponding wording.
5915 We further recommend issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#669">669</a> be handled identically.
5920 2009-07-14 Alan reopens with improved wording.
5930 No consensus for closing as NAD. Leave in Review.
5935 <p><b>Proposed resolution:</b></p>
5937 Change 22.4.6.1.2 [locale.money.get.virtuals] p3:
5941 -3- <del>If the first character (if any) in the string pos returned by
5942 <tt>mp.positive_sign()</tt> or the string <tt>neg</tt> returned by
5943 <tt>mp.negative_sign()</tt> is recognized in the position indicated by
5944 sign in the format pattern, it is consumed and any remaining characters
5945 in the string are required after all the other format components.
5946 [<i>Example:</i> If <tt>showbase</tt> is off�, then for a <tt>neg</tt>
5947 value of "()" and a currency symbol of "L", in "(100 L)" the "L" is
5948 consumed; but if <tt>neg</tt> is "-", the "L" in "-100 L" is not
5949 consumed. -- <i>end example</i>] If <tt>pos</tt> or <tt>neg</tt> is
5950 empty, the sign component is optional, and if no sign is detected, the
5951 result is given the sign that corresponds to the source of the empty
5952 string. Otherwise, the character in the indicated position must match
5953 the first character of <tt>pos</tt> or <tt>neg</tt>, and the result is
5954 given the corresponding sign. If the first character of <tt>pos</tt> is
5955 equal to the first character of <tt>neg</tt>, or if both strings are
5956 empty, the result is given a positive sign.</del>
5958 <ins>The sign pattern strings <tt>pos</tt> and <tt>neg</tt> are returned by
5959 <tt>mp.positive_sign()</tt> and <tt>mp.negative_sign()</tt> respectively. A sign pattern
5960 is matched if its first character is recognized in <tt>s</tt> in the position
5961 indicated by <tt>sign</tt> in the format pattern, or if the pattern is empty and
5962 there is no sign recognized in <tt>s</tt>. A match is required to occur. If both
5963 patterns are matched, the result is given a positive sign, otherwise the
5964 result is given the sign corresponding to the matched pattern.
5965 If the pattern contains more than one character, the characters after the first
5966 must be matched in <tt>s</tt> after all other format components.
5968 characters are matched, <tt>s</tt> is consumed up to and including those characters.
5969 [<i>Example:</i> If <tt>showbase</tt> is off, then for a <tt>neg</tt>
5970 value of "<tt>()</tt>" and a currency symbol of "<tt>L</tt>", in
5971 "<tt>(100 L)</tt>" the entire string is consumed; but for a <tt>neg</tt>
5972 value of "<tt>-</tt>", in "<tt>-100 L</tt>", the string is consumed
5973 through the second "<tt>0</tt>" (the space and "<tt>L</tt>" are not consumed). — <i>end
5982 <h3><a name="671"></a>671. precision of hexfloat</h3>
5983 <p><b>Section:</b> 22.4.2.2.2 [facet.num.put.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
5984 <b>Submitter:</b> John Salmon <b>Opened:</b> 2007-04-20 <b>Last modified:</b> 2009-07-26</p>
5985 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#facet.num.put.virtuals">active issues</a> in [facet.num.put.virtuals].</p>
5986 <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>
5987 <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>
5988 <p><b>Discussion:</b></p>
5990 I am trying to understand how TR1 supports hex float (%a) output.
5993 As far as I can tell, it does so via the following:
5996 8.15 Additions to header <locale> [tr.c99.locale]
5999 In subclause 22.4.2.2.2 [facet.num.put.virtuals], Table 58 Floating-point conversions, after
6001 floatfield == ios_base::scientific %E
6006 <blockquote><pre>floatfield == ios_base::fixed | ios_base::scientific && !uppercase %a
6007 floatfield == ios_base::fixed | ios_base::scientific %A 2
6010 [Note: The additional requirements on print and scan functions, later
6011 in this clause, ensure that the print functions generate hexadecimal
6012 floating-point fields with a %a or %A conversion specifier, and that
6013 the scan functions match hexadecimal floating-point fields with a %g
6014 conversion specifier. end note]
6017 Following the thread, in 22.4.2.2.2 [facet.num.put.virtuals], we find:
6020 For conversion from a floating-point type, if (flags & fixed) != 0 or
6021 if str.precision() > 0, then str.precision() is specified in the
6022 conversion specification.
6025 This would seem to imply that when floatfield == fixed|scientific, the
6026 precision of the conversion specifier is to be taken from
6027 str.precision(). Is this really what's intended? I sincerely hope
6028 that I'm either missing something or this is an oversight. Please
6029 tell me that the committee did not intend to mandate that hex floats
6030 (and doubles) should by default be printed as if by %.6a.
6034 Howard: I think the fundamental issue we overlooked was that with %f,
6035 %e, %g, the default precision was always 6. With %a the default
6036 precision is not 6, it is infinity. So for the first time, we need to
6037 distinguish between the default value of precision, and the precision
6049 Leave this open for Robert and Daniel to work on.
6052 Straw poll: Disposition?
6055 <li>Default is %.6a (i.e. NAD): 2</li>
6056 <li>Always %a (no precision): 6</li>
6057 <li>precision(-1) == %a: 3</li>
6060 Daniel and Robert have direction to write up wording for the "always %a" solution.
6064 2009-07-15 Robert provided wording.
6071 <p><b>Proposed resolution:</b></p>
6073 Change 22.4.2.2.2 [facet.num.put.virtuals], Stage 1, under p5 (near the end
6078 For conversion from a floating-point type, <tt>str.precision()</tt> is specified
6079 <ins>as precision</ins> in the conversion specification
6080 <ins>if <tt>floatfield != (ios_base::fixed | ios_base::scientific)</tt>, else no
6081 precision is specified</ins>.
6087 Kona (2007): Robert volunteers to propose wording.
6095 <h3><a name="676"></a>676. Moving the unordered containers</h3>
6096 <p><b>Section:</b> 23.5 [unord] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6097 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2007-05-05 <b>Last modified:</b> 2009-07-28</p>
6098 <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>
6099 <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>
6100 <p><b>Discussion:</b></p>
6102 Move semantics are missing from the <tt>unordered</tt> containers. The proposed
6103 resolution below adds move-support consistent with
6104 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1858.html">N1858</a>
6105 and the current working draft.
6109 The current proposed resolution simply lists the requirements for each function.
6110 These might better be hoisted into the requirements table for unordered associative containers.
6111 Futhermore a mild reorganization of the container requirements could well be in order.
6112 This defect report is purposefully ignoring these larger issues and just focusing
6113 on getting the unordered containers "moved".
6117 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
6123 <p><b>Proposed resolution:</b></p>
6126 Add to 23.5 [unord]:
6129 <blockquote><pre>template <class Key, class T, class Hash, class Pred, class Alloc>
6130 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
6131 unordered_map<Key, T, Hash, Pred, Alloc>& y);
6133 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6134 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
6135 unordered_map<Key, T, Hash, Pred, Alloc>&& y);</ins>
6137 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6138 void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x,
6139 unordered_map<Key, T, Hash, Pred, Alloc>& y);</ins>
6141 template <class Key, class T, class Hash, class Pred, class Alloc>
6142 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
6143 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
6145 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6146 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
6147 unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);</ins>
6149 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6150 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x,
6151 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);</ins>
6155 template <class Value, class Hash, class Pred, class Alloc>
6156 void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
6157 unordered_set<Value, Hash, Pred, Alloc>& y);
6159 <ins>template <class Value, class Hash, class Pred, class Alloc>
6160 void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
6161 unordered_set<Value, Hash, Pred, Alloc>&& y);</ins>
6163 <ins>template <class Value, class Hash, class Pred, class Alloc>
6164 void swap(unordered_set<Value, Hash, Pred, Alloc>&& x,
6165 unordered_set<Value, Hash, Pred, Alloc>& y);</ins>
6167 template <class Value, class Hash, class Pred, class Alloc>
6168 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
6169 unordered_multiset<Value, Hash, Pred, Alloc>& y);
6171 <ins>template <class Value, class Hash, class Pred, class Alloc>
6172 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
6173 unordered_multiset<Value, Hash, Pred, Alloc>&& y);</ins>
6175 <ins>template <class Value, class Hash, class Pred, class Alloc>
6176 void swap(unordered_multiset<Value, Hash, Pred, Alloc>&& x,
6177 unordered_multiset<Value, Hash, Pred, Alloc>& y);</ins>
6180 <p><b><tt>unordered_map</tt></b></p>
6183 Change 23.5.1 [unord.map]:
6186 <blockquote><pre>class unordered_map
6189 unordered_map(const unordered_map&);
6190 <ins>unordered_map(unordered_map&&);</ins>
6192 unordered_map& operator=(const unordered_map&);
6193 <ins>unordered_map& operator=(unordered_map&&);</ins>
6196 <del>std::</del>pair<iterator, bool> insert(const value_type& obj);
6197 <ins>template <class P> pair<iterator, bool> insert(P&& obj);</ins>
6198 iterator insert(iterator hint, const value_type& obj);
6199 <ins>template <class P> iterator insert(iterator hint, P&& obj);</ins>
6200 const_iterator insert(const_iterator hint, const value_type& obj);
6201 <ins>template <class P> const_iterator insert(const_iterator hint, P&& obj);</ins>
6203 void swap(unordered_map&<ins>&</ins>);
6205 mapped_type& operator[](const key_type& k);
6206 <ins>mapped_type& operator[](key_type&& k);</ins>
6210 template <class Key, class T, class Hash, class Pred, class Alloc>
6211 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
6212 unordered_map<Key, T, Hash, Pred, Alloc>& y);
6214 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6215 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
6216 unordered_map<Key, T, Hash, Pred, Alloc>&& y);</ins>
6218 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6219 void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x,
6220 unordered_map<Key, T, Hash, Pred, Alloc>& y);</ins>
6224 Add to 23.5.1.1 [unord.map.cnstr]:
6228 <pre>template <class InputIterator>
6229 unordered_map(InputIterator f, InputIterator l,
6230 size_type n = <i>implementation-defined</i>,
6231 const hasher& hf = hasher(),
6232 const key_equal& eql = key_equal(),
6233 const allocator_type& a = allocator_type());
6238 <i>Requires:</i> If the iterator's dereference operator returns an
6239 lvalue or a const rvalue <tt>pair<key_type, mapped_type></tt>,
6240 then both <tt>key_type</tt> and <tt>mapped_type</tt> shall be
6241 <tt>CopyConstructible</tt>.
6247 Add to 23.5.1.2 [unord.map.elem]:
6252 <pre>mapped_type& operator[](const key_type& k);</pre>
6257 <i>Requires:</i> <tt>key_type</tt> shall be <tt>CopyConstructible</tt>
6258 and <tt>mapped_type</tt> shall be <tt>DefaultConstructible</tt>.
6262 <pre><ins>mapped_type& operator[](key_type&& k);</ins></pre>
6266 <i>Effects:</i> If the <tt>unordered_map</tt> does not already contain an
6267 element whose key is equivalent to <tt>k</tt> , inserts the value
6268 <tt>std::pair<const key_type, mapped_type>(std::move(k), mapped_type())</tt>.
6272 <i>Requires:</i> <tt>mapped_type</tt> shall be <tt>DefaultConstructible</tt>.
6276 <i>Returns:</i> A reference to <tt>x.second</tt>, where <tt>x</tt> is the
6277 (unique) element whose key is equivalent to <tt>k</tt>.
6285 Add new section [unord.map.modifiers]:
6289 <pre><ins>pair<iterator, bool> insert(const value_type& x);</ins>
6290 <ins>template <class P> pair<iterator, bool> insert(P&& x);</ins>
6291 <ins>iterator insert(iterator hint, const value_type& x);</ins>
6292 <ins>template <class P> iterator insert(iterator hint, P&& x);</ins>
6293 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
6294 <ins>template <class P> const_iterator insert(const_iterator hint, P&& x);</ins>
6295 <ins>template <class InputIterator>
6296 void insert(InputIterator first, InputIterator last);</ins>
6301 <i>Requires:</i> Those signatures taking a <tt>const value_type&</tt> parameter
6302 requires both the <tt>key_type</tt> and the <tt>mapped_type</tt> to be
6303 <tt>CopyConstructible</tt>.
6307 <tt>P</tt> shall be convertible to <tt>value_type</tt>.
6308 If <tt>P</tt> is instantiated as a reference
6309 type, then the argument <tt>x</tt> is copied from. Otherwise <tt>x</tt>
6310 is considered to be an rvalue as it is converted to <tt>value_type</tt>
6311 and inserted into the <tt>unordered_map</tt>. Specifically, in such
6312 cases <tt>CopyConstructible</tt> is not required of <tt>key_type</tt> or
6313 <tt>mapped_type</tt> unless the conversion from <tt>P</tt> specifically
6314 requires it (e.g. if <tt>P</tt> is a <tt>tuple<const key_type,
6315 mapped_type></tt>, then <tt>key_type</tt> must be
6316 <tt>CopyConstructible</tt>).
6320 The signature taking <tt>InputIterator</tt>
6321 parameters requires <tt>CopyConstructible</tt> of both
6322 <tt>key_type</tt> and <tt>mapped_type</tt> if the dereferenced
6323 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
6324 <tt>value_type</tt>.
6332 Add to 23.5.1.3 [unord.map.swap]:
6336 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
6337 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
6338 unordered_map<Key, T, Hash, Pred, Alloc>& y);
6339 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6340 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
6341 unordered_map<Key, T, Hash, Pred, Alloc>&& y);</ins>
6342 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6343 void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x,
6344 unordered_map<Key, T, Hash, Pred, Alloc>& y);</ins>
6348 <p><b><tt>unordered_multimap</tt></b></p>
6351 Change 23.5.2 [unord.multimap]:
6354 <blockquote><pre>class unordered_multimap
6357 unordered_multimap(const unordered_multimap&);
6358 <ins>unordered_multimap(unordered_multimap&&);</ins>
6359 ~unordered_multimap();
6360 unordered_multimap& operator=(const unordered_multimap&);
6361 <ins>unordered_multimap& operator=(unordered_multimap&&);</ins>
6364 iterator insert(const value_type& obj);
6365 <ins>template <class P> iterator insert(P&& obj);</ins>
6366 iterator insert(iterator hint, const value_type& obj);
6367 <ins>template <class P> iterator insert(iterator hint, P&& obj);</ins>
6368 const_iterator insert(const_iterator hint, const value_type& obj);
6369 <ins>template <class P> const_iterator insert(const_iterator hint, P&& obj);</ins>
6371 void swap(unordered_multimap&<ins>&</ins>);
6375 template <class Key, class T, class Hash, class Pred, class Alloc>
6376 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
6377 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
6379 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6380 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
6381 unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);</ins>
6383 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6384 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x,
6385 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);</ins>
6389 Add to 23.5.2.1 [unord.multimap.cnstr]:
6393 <pre>template <class InputIterator>
6394 unordered_multimap(InputIterator f, InputIterator l,
6395 size_type n = <i>implementation-defined</i>,
6396 const hasher& hf = hasher(),
6397 const key_equal& eql = key_equal(),
6398 const allocator_type& a = allocator_type());
6403 <i>Requires:</i> If the iterator's dereference operator returns an
6404 lvalue or a const rvalue <tt>pair<key_type, mapped_type></tt>,
6405 then both <tt>key_type</tt> and <tt>mapped_type</tt> shall be
6406 <tt>CopyConstructible</tt>.
6412 Add new section [unord.multimap.modifiers]:
6416 <pre><ins>iterator insert(const value_type& x);</ins>
6417 <ins>template <class P> iterator insert(P&& x);</ins>
6418 <ins>iterator insert(iterator hint, const value_type& x);</ins>
6419 <ins>template <class P> iterator insert(iterator hint, P&& x);</ins>
6420 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
6421 <ins>template <class P> const_iterator insert(const_iterator hint, P&& x);</ins>
6422 <ins>template <class InputIterator>
6423 void insert(InputIterator first, InputIterator last);</ins>
6428 <i>Requires:</i> Those signatures taking a <tt>const value_type&</tt> parameter
6429 requires both the <tt>key_type</tt> and the <tt>mapped_type</tt> to be
6430 <tt>CopyConstructible</tt>.
6434 <tt>P</tt> shall be convertible to <tt>value_type</tt>.
6435 If <tt>P</tt> is instantiated as a reference
6436 type, then the argument <tt>x</tt> is copied from. Otherwise <tt>x</tt>
6437 is considered to be an rvalue as it is converted to <tt>value_type</tt>
6438 and inserted into the <tt>unordered_multimap</tt>. Specifically, in such
6439 cases <tt>CopyConstructible</tt> is not required of <tt>key_type</tt> or
6440 <tt>mapped_type</tt> unless the conversion from <tt>P</tt> specifically
6441 requires it (e.g. if <tt>P</tt> is a <tt>tuple<const key_type,
6442 mapped_type></tt>, then <tt>key_type</tt> must be
6443 <tt>CopyConstructible</tt>).
6447 The signature taking <tt>InputIterator</tt>
6448 parameters requires <tt>CopyConstructible</tt> of both
6449 <tt>key_type</tt> and <tt>mapped_type</tt> if the dereferenced
6450 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
6451 <tt>value_type</tt>.
6458 Add to 23.5.2.2 [unord.multimap.swap]:
6462 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
6463 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
6464 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
6465 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6466 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
6467 unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);</ins>
6468 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6469 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x,
6470 unordered_multimap<Key, T, Hash, Pred, Alloc>& y);</ins>
6474 <p><b><tt>unordered_set</tt></b></p>
6477 Change 23.5.3 [unord.set]:
6480 <blockquote><pre>class unordered_set
6483 unordered_set(const unordered_set&);
6484 <ins>unordered_set(unordered_set&&);</ins>
6486 unordered_set& operator=(const unordered_set&);
6487 <ins>unordered_set& operator=(unordered_set&&);</ins>
6490 <del>std::</del>pair<iterator, bool> insert(const value_type& obj);
6491 <ins>pair<iterator, bool> insert(value_type&& obj);</ins>
6492 iterator insert(iterator hint, const value_type& obj);
6493 <ins>iterator insert(iterator hint, value_type&& obj);</ins>
6494 const_iterator insert(const_iterator hint, const value_type& obj);
6495 <ins>const_iterator insert(const_iterator hint, value_type&& obj);</ins>
6497 void swap(unordered_set&<ins>&</ins>);
6501 template <class Key, class T, class Hash, class Pred, class Alloc>
6502 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
6503 unordered_set<Key, T, Hash, Pred, Alloc>& y);
6505 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6506 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
6507 unordered_set<Key, T, Hash, Pred, Alloc>&& y);</ins>
6509 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6510 void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x,
6511 unordered_set<Key, T, Hash, Pred, Alloc>& y);</ins>
6515 Add to 23.5.3.1 [unord.set.cnstr]:
6519 <pre>template <class InputIterator>
6520 unordered_set(InputIterator f, InputIterator l,
6521 size_type n = <i>implementation-defined</i>,
6522 const hasher& hf = hasher(),
6523 const key_equal& eql = key_equal(),
6524 const allocator_type& a = allocator_type());
6529 <i>Requires:</i> If the iterator's dereference operator returns an
6530 lvalue or a const rvalue <tt>value_type</tt>, then the
6531 <tt>value_type</tt> shall be <tt>CopyConstructible</tt>.
6537 Add new section [unord.set.modifiers]:
6541 <pre><ins>pair<iterator, bool> insert(const value_type& x);</ins>
6542 <ins>pair<iterator, bool> insert(value_type&& x);</ins>
6543 <ins>iterator insert(iterator hint, const value_type& x);</ins>
6544 <ins>iterator insert(iterator hint, value_type&& x);</ins>
6545 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
6546 <ins>const_iterator insert(const_iterator hint, value_type&& x);</ins>
6547 <ins>template <class InputIterator>
6548 void insert(InputIterator first, InputIterator last);</ins>
6554 <i>Requires:</i> Those signatures taking a <tt>const
6555 value_type&</tt> parameter requires the <tt>value_type</tt> to
6556 be <tt>CopyConstructible</tt>.
6560 The signature taking <tt>InputIterator</tt> parameters requires
6561 <tt>CopyConstructible</tt> of <tt>value_type</tt> if the dereferenced
6562 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
6563 <tt>value_type</tt>.
6571 Add to 23.5.3.2 [unord.set.swap]:
6575 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
6576 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
6577 unordered_set<Key, T, Hash, Pred, Alloc>& y);
6578 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6579 void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x,
6580 unordered_set<Key, T, Hash, Pred, Alloc>&& y);</ins>
6581 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6582 void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x,
6583 unordered_set<Key, T, Hash, Pred, Alloc>& y);</ins>
6587 <p><b><tt>unordered_multiset</tt></b></p>
6590 Change 23.5.4 [unord.multiset]:
6593 <blockquote><pre>class unordered_multiset
6596 unordered_multiset(const unordered_multiset&);
6597 <ins>unordered_multiset(unordered_multiset&&);</ins>
6598 ~unordered_multiset();
6599 unordered_multiset& operator=(const unordered_multiset&);
6600 <ins>unordered_multiset& operator=(unordered_multiset&&);</ins>
6603 iterator insert(const value_type& obj);
6604 <ins>iterator insert(value_type&& obj);</ins>
6605 iterator insert(iterator hint, const value_type& obj);
6606 <ins>iterator insert(iterator hint, value_type&& obj);</ins>
6607 const_iterator insert(const_iterator hint, const value_type& obj);
6608 <ins>const_iterator insert(const_iterator hint, value_type&& obj);</ins>
6610 void swap(unordered_multiset&<ins>&</ins>);
6614 template <class Key, class T, class Hash, class Pred, class Alloc>
6615 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
6616 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
6618 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6619 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
6620 unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);</ins>
6622 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6623 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x,
6624 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);</ins>
6628 Add to 23.5.4.1 [unord.multiset.cnstr]:
6632 <pre>template <class InputIterator>
6633 unordered_multiset(InputIterator f, InputIterator l,
6634 size_type n = <i>implementation-defined</i>,
6635 const hasher& hf = hasher(),
6636 const key_equal& eql = key_equal(),
6637 const allocator_type& a = allocator_type());
6642 <i>Requires:</i> If the iterator's dereference operator returns an
6643 lvalue or a const rvalue <tt>value_type</tt>, then the
6644 <tt>value_type</tt> shall be <tt>CopyConstructible</tt>.
6650 Add new section [unord.multiset.modifiers]:
6654 <pre><ins>iterator insert(const value_type& x);</ins>
6655 <ins>iterator insert(value_type&& x);</ins>
6656 <ins>iterator insert(iterator hint, const value_type& x);</ins>
6657 <ins>iterator insert(iterator hint, value_type&& x);</ins>
6658 <ins>const_iterator insert(const_iterator hint, const value_type& x);</ins>
6659 <ins>const_iterator insert(const_iterator hint, value_type&& x);</ins>
6660 <ins>template <class InputIterator>
6661 void insert(InputIterator first, InputIterator last);</ins>
6667 <i>Requires:</i> Those signatures taking a <tt>const
6668 value_type&</tt> parameter requires the <tt>value_type</tt> to
6669 be <tt>CopyConstructible</tt>.
6673 The signature taking <tt>InputIterator</tt> parameters requires
6674 <tt>CopyConstructible</tt> of <tt>value_type</tt> if the dereferenced
6675 <tt>InputIterator</tt> returns an lvalue or <tt>const</tt> rvalue
6676 <tt>value_type</tt>.
6684 Add to 23.5.4.2 [unord.multiset.swap]:
6688 <pre>template <class Key, class T, class Hash, class Pred, class Alloc>
6689 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
6690 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
6691 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6692 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x,
6693 unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);</ins>
6694 <ins>template <class Key, class T, class Hash, class Pred, class Alloc>
6695 void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x,
6696 unordered_multiset<Key, T, Hash, Pred, Alloc>& y);</ins>
6703 Voted to WP in Bellevue.
6708 post Bellevue, Pete notes:
6714 Please remind people who are reviewing issues to check that the text
6715 modifications match the current draft. Issue 676, for example, adds two
6716 overloads for unordered_map::insert taking a hint. One takes a
6717 const_iterator and returns a const_iterator, and the other takes an
6718 iterator and returns an iterator. This was correct at the time the issue
6719 was written, but was changed in Toronto so there is only one hint
6720 overload, taking a const_iterator and returning an iterator.
6723 This issue is not ready. In addition to the relatively minor signature
6724 problem I mentioned earlier, it puts requirements in the wrong places.
6725 Instead of duplicating requirements throughout the template
6726 specifications, it should put them in the front matter that talks about
6727 requirements for unordered containers in general. This presentation
6728 problem is editorial, but I'm not willing to do the extensive rewrite
6729 that it requires. Please put it back into Open status.
6733 <p><b>Rationale:</b></p>
6741 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2776.pdf">N2776</a>.
6750 <h3><a name="696"></a>696. <code>istream::operator>>(int&)</code> broken</h3>
6751 <p><b>Section:</b> 27.7.1.2.2 [istream.formatted.arithmetic] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
6752 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2007-06-23 <b>Last modified:</b> 2009-07-15</p>
6753 <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>
6754 <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>
6755 <p><b>Discussion:</b></p>
6757 From message c++std-lib-17897:
6760 The code shown in 27.7.1.2.2 [istream.formatted.arithmetic] as the "as if"
6761 implementation of the two arithmetic extractors that don't have a
6762 corresponding <code>num_get</code> interface (i.e., the
6763 <code>short</code> and <code>int</code> overloads) is subtly buggy in
6764 how it deals with <code>EOF</code>, overflow, and other similar
6765 conditions (in addition to containing a few typos).
6768 One problem is that if <code>num_get::get()</code> reaches the EOF
6769 after reading in an otherwise valid value that exceeds the limits of
6770 the narrower type (but not <code>LONG_MIN</code> or
6771 <code>LONG_MAX</code>), it will set <code><i>err</i></code> to
6772 <code>eofbit</code>. Because of the if condition testing for
6773 <code>(<i>err</i> == 0)</code>, the extractor won't set
6774 <code>failbit</code> (and presumably, return a bogus value to the
6778 Another problem with the code is that it never actually sets the
6779 argument to the extracted value. It can't happen after the call to
6780 <code>setstate()</code> since the function may throw, so we need to
6781 show when and how it's done (we can't just punt as say: "it happens
6782 afterwards"). However, it turns out that showing how it's done isn't
6783 quite so easy since the argument is normally left unchanged by the
6784 facet on error except when the error is due to a misplaced thousands
6785 separator, which causes <code>failbit</code> to be set but doesn't
6786 prevent the facet from storing the value.
6795 We believe this part of the Standard has been recently adjusted
6796 and that this issue was addressed during that rewrite.
6804 2009-05-28 Howard adds:
6810 I've moved this issue from Tentatively NAD to Open.
6814 The current wording of
6815 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2857.pdf">N2857</a>
6816 in 22.4.2.1.2 [facet.num.get.virtuals] p3, stage 3 appears to indicate that
6817 in parsing arithmetic types, the value is always set, but sometimes in addition
6818 to setting <tt>failbit</tt>.
6823 If there is a range error, the value is set to min or max, else
6826 if there is a conversion error, the value is set to 0, else
6829 if there is a grouping error, the value is set to whatever it would be if grouping were ignored, else
6832 the value is set to its error-free result.
6837 However there is a contradictory sentence in 22.4.2.1.2 [facet.num.get.virtuals] p1.
6841 27.7.1.2.2 [istream.formatted.arithmetic] should mimic the behavior of 22.4.2.1.2 [facet.num.get.virtuals]
6842 (whatever we decide that behavior is) for
6843 <tt>int</tt> and <tt>short</tt>, and currently does not. I believe that the
6844 correct code fragment should look like:
6847 <blockquote><pre>typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
6848 iostate err = ios_base::goodbit;
6850 use_facet<numget>(loc).get(*this, 0, *this, err, lval);
6851 if (lval < numeric_limits<int>::min())
6853 err |= ios_base::failbit;
6854 val = numeric_limits<int>::min();
6856 else if (lval > numeric_limits<int>::max())
6858 err |= ios_base::failbit;
6859 val = numeric_limits<int>::max();
6862 val = static_cast<int>(lval);
6878 <p><b>Proposed resolution:</b></p>
6880 Change 22.4.2.1.2 [facet.num.get.virtuals], p1:
6884 -1- <i>Effects:</i> Reads characters from <tt>in</tt>, interpreting them
6885 according to <tt>str.flags()</tt>, <tt>use_facet<ctype<charT>
6886 >(loc)</tt>, and <tt>use_facet< numpunct<charT>
6887 >(loc)</tt>, where <tt>loc</tt> is <tt>str.getloc()</tt>. <del>If an error
6888 occurs, <tt>val</tt> is unchanged; otherwise it is set to the resulting value.</del>
6892 Change 27.7.1.2.2 [istream.formatted.arithmetic], p2 and p3:
6896 <pre>operator>>(short& val);
6900 -2- The conversion occurs as if performed by the following code fragment (using the same notation as for
6901 the preceding code fragment):
6904 <blockquote><pre>typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
6905 iostate err = ios<del>tate</del><ins>_base</ins>::goodbit;
6907 use_facet<numget>(loc).get(*this, 0, *this, err, lval);
6910 else if (lval < numeric_limits<short>::min()
6911 || numeric_limits<short>::max() < lval)
6912 err = ios_base::failbit;</del>
6913 <ins>if (lval < numeric_limits<short>::min())
6915 err |= ios_base::failbit;
6916 val = numeric_limits<short>::min();
6918 else if (lval > numeric_limits<short>::max())
6920 err |= ios_base::failbit;
6921 val = numeric_limits<short>::max();
6924 val = static_cast<short>(lval);
6930 <pre>operator>>(int& val);
6934 -3- The conversion occurs as if performed by the following code fragment (using the same notation as for
6935 the preceding code fragment):
6938 <blockquote><pre>typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
6939 iostate err = ios<del>tate</del><ins>_base</ins>::goodbit;
6941 use_facet<numget>(loc).get(*this, 0, *this, err, lval);
6944 else if (lval < numeric_limits<int>::min()
6945 || numeric_limits<int>::max() < lval)
6946 err = ios_base::failbit;</del>
6947 <ins>if (lval < numeric_limits<int>::min())
6949 err |= ios_base::failbit;
6950 val = numeric_limits<int>::min();
6952 else if (lval > numeric_limits<int>::max())
6954 err |= ios_base::failbit;
6955 val = numeric_limits<int>::max();
6958 val = static_cast<int>(lval);
6971 <h3><a name="704"></a>704. MoveAssignable requirement for container value type overly strict</h3>
6972 <p><b>Section:</b> 23.2 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
6973 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2007-05-20 <b>Last modified:</b> 2009-07-20</p>
6974 <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>
6975 <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>
6976 <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>
6977 <p><b>Discussion:</b></p>
6979 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>.
6980 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
6981 most of the member functions of node-based containers. But the move-related changes
6982 unnecessarily introduced the <tt>MoveAssignable</tt> requirement for those members which used to
6983 require <tt>CopyAssignable</tt>.
6987 We also discussed (c++std-lib-18722) the possibility of dropping <tt>MoveAssignable</tt>
6988 from some of the sequence requirements. Additionally the <i>in-place</i> construction
6989 work may further reduce requirements. For purposes of an easy reference, here are the
6990 minimum sequence requirements as I currently understand them. Those items in requirements
6991 table in the working draft which do not appear below have been purposefully omitted for
6992 brevity as they do not have any requirements of this nature. Some items which do not
6993 have any requirements of this nature are included below just to confirm that they were
6994 not omitted by mistake.
6998 <caption>Container Requirements</caption>
6999 <tbody><tr><td><tt>X u(a)</tt></td><td><tt>value_type</tt> must be <tt>CopyConstructible</tt></td></tr>
7000 <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>
7001 <tr><td><tt>a = u</tt></td><td>Sequences require <tt>value_type</tt> to be <tt>CopyConstructible</tt> and <tt>CopyAssignable</tt>.
7002 Associative containers require <tt>value_type</tt> to be <tt>CopyConstructible</tt>.</td></tr>
7003 <tr><td><tt>a = rv</tt></td><td><tt>array</tt> requires <tt>value_type</tt> to be <tt>MoveAssignable</tt>.
7004 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>
7005 <tr><td><tt>swap(a,u)</tt></td><td><tt>array</tt> and containers with <tt>propagate_never</tt> and
7006 <tt>propagate_on_copy_construction</tt> allocators require <tt>value_type</tt> to be <tt>Swappable</tt>.</td></tr>
7013 <caption>Sequence Requirements</caption>
7014 <tbody><tr><td><tt>X(n)</tt></td><td><tt>value_type</tt> must be <tt>DefaultConstructible</tt></td></tr>
7015 <tr><td><tt>X(n, t)</tt></td><td><tt>value_type</tt> must be <tt>CopyConstructible</tt></td></tr>
7016 <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>.
7017 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
7018 <tr><td><tt>a.insert(p, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
7019 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>CopyAssignable</tt>.</td></tr>
7020 <tr><td><tt>a.insert(p, rv)</tt></td><td>The <tt>value_type</tt> must be <tt>MoveConstructible</tt>.
7021 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>MoveAssignable</tt>.</td></tr>
7022 <tr><td><tt>a.insert(p, n, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.
7023 The sequences <tt>vector</tt> and <tt>deque</tt> also require the <tt>value_type</tt> to be <tt>CopyAssignable</tt>.</td></tr>
7024 <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>.
7025 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.
7026 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.
7027 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>
7028 <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>
7029 <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>
7030 <tr><td><tt>a.clear()</tt></td><td></td></tr>
7031 <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>.
7032 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt> and <tt>MoveAssignable</tt>.</td></tr>
7033 <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>
7034 <tr><td><tt>a.resize(n)</tt></td><td>The <tt>value_type</tt> must be <tt>DefaultConstructible</tt>.
7035 The sequence <tt>vector</tt> also requires the <tt>value_type</tt> to be <tt>MoveConstructible</tt>.</td></tr>
7036 <tr><td><tt>a.resize(n, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7043 <caption>Optional Sequence Requirements</caption>
7044 <tbody><tr><td><tt>a.front()</tt></td><td></td></tr>
7045 <tr><td><tt>a.back()</tt></td><td></td></tr>
7046 <tr><td><tt>a.push_front(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7047 <tr><td><tt>a.push_front(rv)</tt></td><td>The <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
7048 <tr><td><tt>a.push_back(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7049 <tr><td><tt>a.push_back(rv)</tt></td><td>The <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
7050 <tr><td><tt>a.pop_front()</tt></td><td></td></tr>
7051 <tr><td><tt>a.pop_back()</tt></td><td></td></tr>
7052 <tr><td><tt>a[n]</tt></td><td></td></tr>
7053 <tr><td><tt>a.at[n]</tt></td><td></td></tr>
7060 <caption>Associative Container Requirements</caption>
7061 <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>.
7062 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
7063 <tr><td><tt>a_uniq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7064 <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>
7065 <tr><td><tt>a_eq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7066 <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>
7067 <tr><td><tt>a.insert(p, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7068 <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>
7069 <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>.
7070 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>
7077 <caption>Unordered Associative Container Requirements</caption>
7078 <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>.
7079 If the iterators return an rvalue the <tt>value_type</tt> must be <tt>MoveConstructible</tt>.</td></tr>
7080 <tr><td><tt>a_uniq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7081 <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>
7082 <tr><td><tt>a_eq.insert(t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7083 <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>
7084 <tr><td><tt>a.insert(p, t)</tt></td><td>The <tt>value_type</tt> must be <tt>CopyConstructible</tt>.</td></tr>
7085 <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>
7086 <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>.
7087 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>
7094 <caption>Miscellaneous Requirements</caption>
7095 <tbody><tr><td><tt>map[lvalue-key]</tt></td><td>The <tt>key_type</tt> must be <tt>CopyConstructible</tt>.
7096 The <tt>mapped_type</tt> must be <tt>DefaultConstructible</tt> and <tt>MoveConstructible</tt>.</td></tr>
7097 <tr><td><tt>map[rvalue-key]</tt></td><td>The <tt>key_type</tt> must be <tt>MoveConstructible</tt>.
7098 The <tt>mapped_type</tt> must be <tt>DefaultConstructible</tt> and <tt>MoveConstructible</tt>.</td></tr>
7102 Kona (2007): Howard and Alan to update requirements table in issue with emplace signatures.
7107 Bellevue: This should be handled as part of the concepts work.
7112 2009-07-20 Reopened by Howard:
7118 This is one of the issues that was "solved by concepts" and is now no longer solved.
7122 In a nutshell, concepts adopted the "minimum requirements" philosophy outlined
7123 in the discussion of this issue, and enforced it. My strong suggestion is that
7124 we translate the concepts specification into documentation for the containers.
7128 What this means for vendors is that they will have to implement container members
7129 being careful to only use those characteristics of a type that the concepts specification
7130 formally allowed. Note that I <em>am not</em> talking about <tt>enable_if</tt>'ing
7131 everything. I am simply suggesting that (for example) we tell the vendor he can't call <tt>T's</tt>
7132 copy constructor or move constructor within the <tt>emplace</tt> member function, etc.
7136 What this means for customers is that they will be able to use types within C++03
7137 containers which are sometimes not CopyConstructible, and sometimes not even
7138 MoveConstructible, etc.
7144 <p><b>Proposed resolution:</b></p>
7148 <p><b>Rationale:</b></p>
7156 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2776.pdf">N2776</a>.
7165 <h3><a name="711"></a>711. Contradiction in empty <tt>shared_ptr</tt></h3>
7166 <p><b>Section:</b> 20.8.10.2.5 [util.smartptr.shared.obs] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
7167 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2007-08-24 <b>Last modified:</b> 2009-07-17</p>
7168 <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>
7169 <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>
7170 <p><b>Discussion:</b></p>
7173 <a href="http://groups.google.com/group/comp.std.c++/browse_frm/thread/8e89dceb35cd7971">comp.std.c++</a>
7174 has identified a contradiction in the <tt>shared_ptr</tt> specification.
7179 [ <i>Note:</i> this constructor allows creation of an empty shared_ptr instance with a non-NULL stored pointer.
7184 after the aliasing constructor
7187 <blockquote><pre>template<class Y> shared_ptr(shared_ptr<Y> const& r, T *p);
7191 reflects the intent of
7192 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2351.htm">N2351</a>
7193 to, well, allow the creation of an empty <tt>shared_ptr</tt>
7194 with a non-NULL stored pointer.
7198 This is contradicted by the second sentence in the Returns clause of 20.8.10.2.5 [util.smartptr.shared.obs]:
7202 <pre>T* get() const;
7205 <i>Returns:</i> the stored pointer. Returns a null pointer if <tt>*this</tt> is empty.
7216 Adopt option 1 and move to review, not ready.
7219 There was a lot of confusion about what an empty <tt>shared_ptr</tt> is (the term
7220 isn't defined anywhere), and whether we have a good mental model for how
7221 one behaves. We think it might be possible to deduce what the definition
7222 should be, but the words just aren't there. We need to open an issue on
7223 the use of this undefined term. (The resolution of that issue might
7224 affect the resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#711">711</a>.)
7227 The LWG is getting more uncomfortable with the aliasing proposal (N2351)
7228 now that we realize some of its implications, and we need to keep an eye
7229 on it, but there isn't support for removing this feature at this time.
7240 We heard from Peter Dimov, who explained his reason for preferring solution 1.
7243 Because it doesn't seem to add anything. It simply makes the behavior
7244 for p = 0 undefined. For programmers who don't create empty pointers
7245 with p = 0, there is no difference. Those who do insist on creating them
7246 presumably have a good reason, and it costs nothing for us to define the
7247 behavior in this case.
7250 The aliasing constructor is sharp enough as it is, so "protecting" users
7251 doesn't make much sense in this particular case.
7254 > Do you have a use case for r being empty and r being non-null?
7257 I have received a few requests for it from "performance-conscious"
7258 people (you should be familiar with this mindset) who don't like the
7259 overhead of allocating and maintaining a control block when a null
7260 deleter is used to approximate a raw pointer. It is obviously an "at
7261 your own risk", low-level feature; essentially a raw pointer behind a
7265 We could not agree upon a resolution to the issue; some of us thought
7266 that Peter's description above is supporting an undesirable behavior.
7277 We favor option 1, move to Ready.
7280 Howard: Option 2 commented out for clarity, and can be brought back.
7287 <p><b>Proposed resolution:</b></p>
7289 In keeping the N2351 spirit and obviously my preference, change 20.8.10.2.5 [util.smartptr.shared.obs]:
7293 <pre>T* get() const;
7296 <i>Returns:</i> the stored pointer. <del>Returns a null pointer if <tt>*this</tt> is empty.</del>
7308 <h3><a name="716"></a>716. Production in [re.grammar] not actually modified</h3>
7309 <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#Ready">Ready</a>
7310 <b>Submitter:</b> Stephan T. Lavavej <b>Opened:</b> 2007-08-31 <b>Last modified:</b> 2009-07-16</p>
7311 <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>
7312 <p><b>Discussion:</b></p>
7314 TR1 7.13 [tr.re.grammar]/3 and C++0x WP 28.13 [re.grammar]/3 say:
7319 The following productions within the ECMAScript grammar are modified as follows:
7322 <blockquote><pre>CharacterClass ::
7323 [ [lookahead ∉ {^}] ClassRanges ]
7330 This definition for <tt>CharacterClass</tt> appears to be exactly identical to that in ECMA-262.
7334 Was an actual modification intended here and accidentally omitted, or was this production accidentally included?
7343 We agree that what is specified is identical to what ECMA-262 specifies.
7344 Pete would like to take a bit of time to assess whether we had intended,
7345 but failed, to make a change.
7346 It would also be useful to hear from John Maddock on the issue.
7364 <p><b>Proposed resolution:</b></p>
7366 Remove this mention of the CharacterClass production.
7369 <blockquote><pre><del>CharacterClass ::
7370 [ [lookahead ∉ {^}] ClassRanges ]
7371 [ ^ ClassRanges ]</del>
7380 <h3><a name="719"></a>719. <tt>std::is_literal</tt> type traits should be provided</h3>
7381 <p><b>Section:</b> 20.6 [meta] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7382 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2007-08-25 <b>Last modified:</b> 2009-07-16</p>
7383 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#meta">active issues</a> in [meta].</p>
7384 <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>
7385 <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>
7386 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#750">750</a></p>
7387 <p><b>Discussion:</b></p>
7389 Since the inclusion of <tt>constexpr</tt> in the standard draft N2369 we have
7390 a new type category "literal", which is defined in 3.9 [basic.types]/p.11:
7395 -11- A type is a <i>literal</i> type if it is:
7398 <li>a scalar type; or</li>
7399 <li><p>a class type (clause 9) with</p>
7401 <li>a trivial copy constructor,</li>
7402 <li>a trivial destructor,</li>
7403 <li>at least one constexpr constructor other than the copy constructor,</li>
7404 <li>no virtual base classes, and</li>
7405 <li>all non-static data members and base classes of literal types; or</li>
7408 <li>an array of literal type.</li>
7413 I strongly suggest that the standard provides a type traits for
7414 literal types in 20.6.4.3 [meta.unary.prop] for several reasons:
7418 <li>To keep the traits in sync with existing types.</li>
7419 <li>I see many reasons for programmers to use this trait in template
7420 code to provide optimized template definitions for these types,
7422 <li>A user-provided definition of this trait is practically impossible
7423 to write portably.</li>
7427 The special problem of reason (c) is that I don't see currently a
7428 way to portably test the condition for literal class types:
7433 <li>at least one constexpr constructor other than the copy constructor,</li>
7440 Alisdair is considering preparing a paper listing a number of missing
7441 type traits, and feels that it might be useful to handle them all
7442 together rather than piecemeal. This would affect issue 719 and 750.
7443 These two issues should move to OPEN pending AM paper on type traits.
7453 Beman, Daniel, and Alisdair will work on a paper proposing new type traits.
7457 <p><b>Proposed resolution:</b></p>
7459 In 20.6.2 [meta.type.synop] in the group "type properties",
7463 <blockquote><pre>template <class T> struct is_pod;
7470 <blockquote><pre>template <class T> struct is_literal;
7474 In 20.6.4.3 [meta.unary.prop], table Type Property Predicates, just
7475 below the line for the <tt>is_pod</tt> property add a new line:
7480 <th>Template</th><th>Condition</th><th>Preconditions</th>
7483 <td><tt>template <class T> struct is_literal;</tt></td>
7484 <td><tt>T</tt> is a literal type (3.9)</td>
7485 <td><tt>T</tt> shall be a complete type, an
7486 array of unknown bound, or
7487 (possibly cv-qualified) <tt>void</tt>.</td>
7497 <h3><a name="723"></a>723. <tt>basic_regex</tt> should be moveable</h3>
7498 <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#Ready">Ready</a>
7499 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2007-08-29 <b>Last modified:</b> 2009-07-16</p>
7500 <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>
7501 <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>
7502 <p><b>Discussion:</b></p>
7504 <p><b>Addresses UK 316</b></p>
7507 According to the current state of the standard draft, the class
7508 template <tt>basic_regex</tt>, as described in 28.8 [re.regex]/3, is
7509 neither <tt>MoveConstructible</tt> nor <tt>MoveAssignable</tt>.
7510 IMO it should be, because typical regex state machines tend
7511 to have a rather large data quantum and I have seen several
7512 use cases, where a factory function returns regex values,
7513 which would take advantage of moveabilities.
7522 Needs wording for the semantics, the idea is agreed upon.
7526 Post Summit Daniel updated wording to reflect new "swap rules".
7541 <p><b>Proposed resolution:</b></p>
7543 In the class definition of <tt>basic_regex</tt>, just below 28.8 [re.regex]/3,
7544 perform the following changes:
7550 Just after <tt>basic_regex(const basic_regex&);</tt> insert:
7553 <blockquote><pre>basic_regex(basic_regex&&);
7558 Just after <tt>basic_regex& operator=(const basic_regex&);</tt> insert:
7560 <blockquote><pre>basic_regex& operator=(basic_regex&&);
7565 Just after <tt>basic_regex& assign(const basic_regex& that);</tt> insert:
7567 <blockquote><pre>basic_regex& assign(basic_regex&& that);
7572 In 28.8.2 [re.regex.construct], just after p.11 add the following
7573 new member definition:
7575 <blockquote><pre>basic_regex(basic_regex&& e);
7579 <i>Effects:</i> Move-constructs a <tt>basic_regex</tt> instance from <tt>e</tt>.
7582 <i>Postconditions:</i> <tt>flags()</tt> and <tt>mark_count()</tt> return <tt>e.flags()</tt> and
7583 <tt>e.mark_count()</tt>, respectively,
7584 that <tt>e</tt> had before construction, leaving
7585 <tt>e</tt> in a valid state with an unspecified value.
7588 <i>Throws:</i> nothing.
7595 Also in 28.8.2 [re.regex.construct], just after p.18 add the
7596 following new member definition:
7599 <blockquote><pre>basic_regex& operator=(basic_regex&& e);
7602 <i>Effects:</i> Returns the result of <tt>assign(std::move(e))</tt>.
7608 In 28.8.3 [re.regex.assign], just after p. 2 add the following new
7611 <blockquote><pre>basic_regex& assign(basic_regex&& rhs);
7615 <i>Effects:</i> Move-assigns a <tt>basic_regex</tt> instance from <tt>rhs</tt> and returns <tt>*this</tt>.
7618 <i>Postconditions:</i> <tt>flags()</tt> and <tt>mark_count()</tt> return <tt>rhs.flags()</tt>
7619 and <tt>rhs.mark_count()</tt>, respectively, that
7620 <tt>rhs</tt> had before assignment, leaving <tt>rhs</tt>
7621 in a valid state with an unspecified value.
7624 <i>Throws:</i> nothing.
7636 <h3><a name="724"></a>724. <tt>DefaultConstructible</tt> is not defined</h3>
7637 <p><b>Section:</b> X [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
7638 <b>Submitter:</b> Pablo Halpern <b>Opened:</b> 2007-09-12 <b>Last modified:</b> 2009-07-28</p>
7639 <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>
7640 <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>
7641 <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>
7642 <p><b>Discussion:</b></p>
7644 The <tt>DefaultConstructible</tt> requirement is referenced in
7645 several places in the August 2007 working draft
7646 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2369.pdf">N2369</a>,
7647 but is not defined anywhere.
7657 Walking into the default/value-initialization mess...
7660 Why two lines? Because we need both expressions to be valid.
7663 AJM not sure what the phrase "default constructed" means. This is
7664 unfortunate, as the phrase is already used 24 times in the library!
7667 Example: const int would not accept first line, but will accept the second.
7670 This is an issue that must be solved by concepts, but we might need to solve it independantly first.
7673 It seems that the requirements are the syntax in the proposed first
7674 column is valid, but not clear what semantics we need.
7677 A table where there is no post-condition seems odd, but appears to sum up our position best.
7680 At a minimum an object is declared and is destuctible.
7683 Move to open, as no-one happy to produce wording on the fly.
7688 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
7694 <p><b>Proposed resolution:</b></p>
7696 In section X [utility.arg.requirements], before table 33, add the
7700 <p style="text-align: center;" align="center">Table 33: <tt>DefaultConstructible</tt> requirements</p>
7702 <div align="center">
7704 <table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0">
7706 <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">
7707 <p style="margin: 0in 0in 0.0001pt; text-align: center;" align="center">expression</p>
7709 <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">
7710 <p style="margin: 0in 0in 0.0001pt; text-align: center;" align="center">post-condition</p>
7714 <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">
7715 <p style="margin: 0in 0in 0.0001pt;"><tt>T
7719 <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">
7720 <p style="margin: 0in 0in 0.0001pt;"><tt>T</tt>
7721 is <i>default constructed.</i></p>
7730 <p><b>Rationale:</b></p>
7736 We believe concepts will solve this problem
7737 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2774.pdf">N2774</a>).
7745 <h3><a name="726"></a>726. Missing <tt>regex_replace()</tt> overloads</h3>
7746 <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>
7747 <b>Submitter:</b> Stephan T. Lavavej <b>Opened:</b> 2007-09-22 <b>Last modified:</b> 2009-07-25</p>
7748 <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>
7749 <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>
7750 <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>
7751 <p><b>Discussion:</b></p>
7753 Two overloads of <tt>regex_replace()</tt> are currently provided:
7756 <blockquote><pre>template <class OutputIterator, class BidirectionalIterator,
7757 class traits, class charT>
7759 regex_replace(OutputIterator out,
7760 BidirectionalIterator first, BidirectionalIterator last,
7761 const basic_regex<charT, traits>& e,
7762 const basic_string<charT>& fmt,
7763 regex_constants::match_flag_type flags =
7764 regex_constants::match_default);
7766 template <class traits, class charT>
7767 basic_string<charT>
7768 regex_replace(const basic_string<charT>& s,
7769 const basic_regex<charT, traits>& e,
7770 const basic_string<charT>& fmt,
7771 regex_constants::match_flag_type flags =
7772 regex_constants::match_default);
7776 <li>Overloads taking <tt>const charT *</tt> are provided for <tt>regex_match()</tt> and
7777 <tt>regex_search()</tt>, but not <tt>regex_replace()</tt>. This is inconsistent.</li>
7779 <p>The absence of <tt>const charT *</tt> overloads prevents ordinary-looking code from compiling, such as:</p>
7781 <blockquote><pre>const string s("kitten");
7782 const regex r("en");
7783 cout << regex_replace(s, r, "y") << endl;
7787 The compiler error message will be something like "could not deduce
7788 template argument for 'const std::basic_string<_Elem> &' from 'const
7793 Users expect that anything taking a <tt>basic_string<charT></tt> can also take a
7794 <tt>const charT *</tt>. In their own code, when they write a function taking
7795 <tt>std::string</tt> (or <tt>std::wstring</tt>), they can pass a <tt>const char *</tt> (or <tt>const
7796 wchar_t *</tt>), thanks to <tt>basic_string</tt>'s implicit constructor. Because the
7797 regex algorithms are templated on <tt>charT</tt>, they can't rely on
7798 <tt>basic_string</tt>'s implicit constructor (as the compiler error message
7799 indicates, template argument deduction fails first).
7803 If a user figures out what the compiler error message means, workarounds
7804 are available - but they are all verbose. Explicit template arguments
7805 could be given to <tt>regex_replace()</tt>, allowing <tt>basic_string</tt>'s implicit
7806 constructor to be invoked - but <tt>charT</tt> is the last template argument, not
7807 the first, so this would be extremely verbose. Therefore, constructing
7808 a <tt>basic_string</tt> from each C string is the simplest workaround.
7813 There is an efficiency consideration: constructing <tt>basic_string</tt>s can
7814 impose performance costs that could be avoided by a library
7815 implementation taking C strings and dealing with them directly.
7816 (Currently, for replacement sources, C strings can be converted into
7817 iterator pairs at the cost of verbosity, but for format strings, there
7818 is no way to avoid constructing a <tt>basic_string</tt>.)
7828 We note that Boost already has these overloads. However, the proposed
7829 wording is provided only for 28.11.4 [re.alg.replace]; wording is needed for the synopsis
7830 as well. We also note that this has impact on <tt>match_results::format</tt>,
7831 which may require further overloads.
7840 Daniel to tweak for us.
7844 2009-07-25 Daniel tweaks both this issue and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#727">727</a>.
7850 This is solved by the proposed resolution of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#727">727</a>.
7856 <p><b>Proposed resolution:</b></p>
7859 Provide additional overloads for <tt>regex_replace()</tt>: one additional
7860 overload of the iterator-based form (taking <tt>const charT* fmt</tt>), and three
7861 additional overloads of the convenience form (one taking <tt>const charT*
7862 str</tt>, another taking <tt>const charT* fmt</tt>, and the third taking both <tt>const
7863 charT* str</tt> and <tt>const charT* fmt</tt>). 28.11.4 [re.alg.replace]:
7867 <pre>template <class OutputIterator, class BidirectionalIterator,
7868 class traits, class charT>
7870 regex_replace(OutputIterator out,
7871 BidirectionalIterator first, BidirectionalIterator last,
7872 const basic_regex<charT, traits>& e,
7873 const basic_string<charT>& fmt,
7874 regex_constants::match_flag_type flags =
7875 regex_constants::match_default);
7877 <ins>template <class OutputIterator, class BidirectionalIterator,
7878 class traits, class charT>
7880 regex_replace(OutputIterator out,
7881 BidirectionalIterator first, BidirectionalIterator last,
7882 const basic_regex<charT, traits>& e,
7884 regex_constants::match_flag_type flags =
7885 regex_constants::match_default);</ins>
7888 <pre>template <class traits, class charT>
7889 basic_string<charT>
7890 regex_replace(const basic_string<charT>& s,
7891 const basic_regex<charT, traits>& e,
7892 const basic_string<charT>& fmt,
7893 regex_constants::match_flag_type flags =
7894 regex_constants::match_default);
7896 <ins>template <class traits, class charT>
7897 basic_string<charT>
7898 regex_replace(const basic_string<charT>& s,
7899 const basic_regex<charT, traits>& e,
7901 regex_constants::match_flag_type flags =
7902 regex_constants::match_default);</ins>
7904 <ins>template <class traits, class charT>
7905 basic_string<charT>
7906 regex_replace(const charT* s,
7907 const basic_regex<charT, traits>& e,
7908 const basic_string<charT>& fmt,
7909 regex_constants::match_flag_type flags =
7910 regex_constants::match_default);</ins>
7912 <ins>template <class traits, class charT>
7913 basic_string<charT>
7914 regex_replace(const charT* s,
7915 const basic_regex<charT, traits>& e,
7917 regex_constants::match_flag_type flags =
7918 regex_constants::match_default);</ins>
7928 <h3><a name="727"></a>727. <tt>regex_replace()</tt> doesn't accept <tt>basic_string</tt>s with custom traits and allocators</h3>
7929 <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>
7930 <b>Submitter:</b> Stephan T. Lavavej <b>Opened:</b> 2007-09-22 <b>Last modified:</b> 2009-07-31</p>
7931 <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>
7932 <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>
7933 <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>
7934 <p><b>Discussion:</b></p>
7936 <tt>regex_match()</tt> and <tt>regex_search()</tt> take <tt>const basic_string<charT, ST,
7937 SA>&</tt>. <tt>regex_replace()</tt> takes <tt>const basic_string<charT>&</tt>. This prevents
7938 <tt>regex_replace()</tt> from accepting <tt>basic_string</tt>s with custom traits and
7943 Overloads of <tt>regex_replace()</tt> taking <tt>basic_string</tt> should be additionally
7944 templated on <tt>class ST, class SA</tt> and take <tt>const basic_string<charT, ST,
7945 SA>&</tt>. Consistency with <tt>regex_match()</tt> and <tt>regex_search()</tt> would place
7946 <tt>class ST, class SA</tt> as the first template arguments; compatibility with
7947 existing code using TR1 and giving explicit template arguments to
7948 <tt>regex_replace()</tt> would place <tt>class ST, class SA</tt> as the last template
7958 Bill comments, "We need to look at the depth of this change."
7961 Pete remarks that we are here dealing with a convenience function
7962 that saves a user from calling the iterato-based overload.
7975 Howard to ask Stephan Lavavej to provide wording.
7979 2009-07-17 Stephan provided wording.
7984 2009-07-25 Daniel tweaks both this issue and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#726">726</a>.
7990 One relevant part of the proposed resolution below suggests
7991 to add a new overload of the format member function in the
7992 <tt>match_results</tt> class template that accepts two character pointers
7993 defining the <tt>begin</tt> and <tt>end</tt> of a format range. A more general
7994 approach could have proposed a pair of iterators instead, but
7995 the used pair of char pointers reflects existing practice. If the
7996 committee strongly favors an iterator-based signature, this
7997 could be simply changed. I think that the minimum requirement
7998 should be a <tt>BidirectionalIterator</tt>, but current implementations
7999 take advantage (at least partially) of the <tt>RandomAccessIterator</tt>
8000 sub interface of the char pointers.
8003 <p><b>Suggested Resolution:</b></p>
8005 <p><i>[Moved into the proposed resloution]</i></p>
8012 2009-07-30 Stephan agrees with Daniel's wording. Howard places Daniel's wording
8013 in the Proposed Resolution.
8019 <p><b>Proposed resolution:</b></p>
8024 Change 28.4 [re.syn] as indicated:
8027 <blockquote><pre>// 28.11.4, function template regex_replace:
8028 template <class OutputIterator, class BidirectionalIterator,
8029 class traits, class charT<ins>, class ST, class SA</ins>>
8031 regex_replace(OutputIterator out,
8032 BidirectionalIterator first, BidirectionalIterator last,
8033 const basic_regex<charT, traits>& e,
8034 const basic_string<charT<ins>, ST, SA</ins>>& fmt,
8035 regex_constants::match_flag_type flags =
8036 regex_constants::match_default);
8039 template <class OutputIterator, class BidirectionalIterator,
8040 class traits, class charT>
8042 regex_replace(OutputIterator out,
8043 BidirectionalIterator first, BidirectionalIterator last,
8044 const basic_regex<charT, traits>& e,
8046 regex_constants::match_flag_type flags =
8047 regex_constants::match_default);
8050 template <class traits, class charT<ins>, class ST, class SA,
8051 class FST, class FSA</ins>>
8052 basic_string<charT<ins>, ST, SA</ins>>
8053 regex_replace(const basic_string<charT<ins>, ST, SA</ins>>& s,
8054 const basic_regex<charT, traits>& e,
8055 const basic_string<charT<ins>, FST, FSA</ins>>& fmt,
8056 regex_constants::match_flag_type flags =
8057 regex_constants::match_default);
8060 template <class traits, class charT, class ST, class SA>
8061 basic_string<charT, ST, SA>
8062 regex_replace(const basic_string<charT, ST, SA>& s,
8063 const basic_regex<charT, traits>& e,
8065 regex_constants::match_flag_type flags =
8066 regex_constants::match_default);
8070 template <class traits, class charT, class ST, class SA>
8071 basic_string<charT>
8072 regex_replace(const charT* s,
8073 const basic_regex<charT, traits>& e,
8074 const basic_string<charT, ST, SA>& fmt,
8075 regex_constants::match_flag_type flags =
8076 regex_constants::match_default);
8080 template <class traits, class charT>
8081 basic_string<charT>
8082 regex_replace(const charT* s,
8083 const basic_regex<charT, traits>& e,
8085 regex_constants::match_flag_type flags =
8086 regex_constants::match_default);
8093 Change 28.10 [re.results]/3, class template <tt>match_results</tt> as
8097 <blockquote><pre><ins>
8098 template <class OutputIter>
8100 format(OutputIter out,
8101 const char_type* fmt_first, const char_type* fmt_last,
8102 regex_constants::match_flag_type flags =
8103 regex_constants::format_default) const;
8106 template <class OutputIter<ins>, class ST, class SA</ins>>
8108 format(OutputIter out,
8109 const <del>string_type</del><ins>basic_string<char_type, ST, SA></ins>& fmt,
8110 regex_constants::match_flag_type flags =
8111 regex_constants::format_default) const;
8113 <ins>template <class ST, class SA></ins>
8114 <del>string_type</del><ins>basic_string<char_type, ST, SA></ins>
8115 format(const <del>string_type</del><ins>basic_string<char_type, ST, SA></ins>& fmt,
8116 regex_constants::match_flag_type flags =
8117 regex_constants::format_default) const;
8121 format(const char_type* fmt,
8122 regex_constants::match_flag_type flags =
8123 regex_constants::format_default) const;
8130 Insert at the very beginning of 28.10.4 [re.results.form] the following:
8133 <blockquote><pre><ins>
8134 template <class OutputIter>
8136 format(OutputIter out,
8137 const char_type* fmt_first, const char_type* fmt_last,
8138 regex_constants::match_flag_type flags =
8139 regex_constants::format_default) const;
8145 1 <i>Requires:</i> The type <tt>OutputIter</tt> shall satisfy the requirements for an
8146 Output Iterator (24.2.3 [output.iterators]).
8150 2 <i>Effects:</i> Copies the character sequence <tt>[fmt_first,fmt_last)</tt> to
8151 <tt>OutputIter out</tt>. Replaces each
8152 format specifier or escape sequence in the copied range with either
8153 the character(s) it represents
8154 or the sequence of characters within <tt>*this</tt> to which it refers. The
8155 bitmasks specified in <tt>flags</tt>
8156 determines what format specifiers and escape sequences are recognized.
8160 3 <i>Returns:</i> <tt>out</tt>.
8168 Change 28.10.4 [re.results.form], before p. 1 until p. 3 (according to
8173 <blockquote><pre>template <class OutputIter<ins>, class ST, class SA</ins>>
8175 format(OutputIter out,
8176 const <del>string_type</del><ins>basic_string<char_type, ST, SA></ins>& fmt,
8177 regex_constants::match_flag_type flags =
8178 regex_constants::format_default) const;
8183 <del><i>Requires:</i> The type <tt>OutputIter</tt> shall satisfy the requirements for
8184 an Output Iterator (24.2.3).</del>
8188 <del><i>Effects:</i> Copies the character sequence <tt>[fmt.begin(),fmt.end())</tt> to
8189 <tt>OutputIter out</tt>. Replaces each
8190 format specifier or escape sequence in <tt>fmt</tt> with either the
8191 character(s) it represents or the sequence of
8192 characters within <tt>*this</tt> to which it refers. The bitmasks specified in
8193 <tt>flags</tt> determines what format
8194 specifiers and escape sequences are recognized.</del>
8198 <i>Returns:</i> <tt><del>out</del><ins>format(out, fmt.data(), fmt.data() +
8199 fmt.size(), flags)</ins></tt>.
8207 Change 28.10.4 [re.results.form], before p. 4 until p. 4 (according to
8208 previous numbering) as indicated:
8211 <blockquote><pre><ins>template <class ST, class SA></ins>
8212 <del>string_type</del><ins>basic_string<char_type, ST, SA></ins>
8213 format(const <del>string_type</del><ins>basic_string<char_type, ST, SA></ins>& fmt,
8214 regex_constants::match_flag_type flags =
8215 regex_constants::format_default) const;
8220 <i>Effects:</i> <del>Returns a copy of the string <tt>fmt</tt>. Replaces each format
8221 specifier or escape sequence
8222 in <tt>fmt</tt> with either the character(s) it represents or the sequence of
8223 characters within <tt>*this</tt> to which
8224 it refers. The bitmasks specified in flags determines what format
8225 specifiers and escape sequences are
8226 recognized.</del> <ins>Constructs an empty string result of type
8227 <tt>basic_string<char_type, ST, SA></tt>,
8228 and calls <tt>format(back_inserter(result), fmt, flags)</tt>.</ins>
8232 <ins><i>Returns:</i> <tt>result</tt></ins>
8240 At the end of 28.10.4 [re.results.form] insert as indicated:
8243 <blockquote><pre><ins>
8245 format(const char_type* fmt,
8246 regex_constants::match_flag_type flags =
8247 regex_constants::format_default) const;
8252 <ins><i>Effects:</i> Constructs an empty string result of type <tt>string_type</tt>, and calls
8253 <tt>format(back_inserter(result), fmt, fmt +
8254 char_traits<char_type>::length(fmt), flags)</tt>.</ins>
8257 <ins><i>Returns:</i> <tt>result</tt></ins>
8266 Change 28.11.4 [re.alg.replace] before p. 1 as indicated:
8269 <blockquote><pre>template <class OutputIterator, class BidirectionalIterator,
8270 class traits, class charT<ins>, class ST, class SA</ins>>
8272 regex_replace(OutputIterator out,
8273 BidirectionalIterator first, BidirectionalIterator last,
8274 const basic_regex<charT, traits>& e,
8275 const basic_string<charT<ins>, ST, SA</ins>>& fmt,
8276 regex_constants::match_flag_type flags =
8277 regex_constants::match_default);
8280 template <class OutputIterator, class BidirectionalIterator,
8281 class traits, class charT>
8283 regex_replace(OutputIterator out,
8284 BidirectionalIterator first, BidirectionalIterator last,
8285 const basic_regex<charT, traits>& e,
8287 regex_constants::match_flag_type flags =
8288 regex_constants::match_default);
8292 <i>Effects:</i> [..]. If any matches are found then, for each such match, if <tt>!(flags &
8293 regex_constants::format_no_copy)</tt> calls <tt>std::copy(m.prefix().first,
8295 out)</tt>, and then calls <tt>m.format(out, fmt, flags)</tt> <ins>for the first
8296 form of the function
8297 and <tt>m.format(out, fmt, fmt + char_traits<charT>::length(fmt), flags)</tt>
8306 Change 28.11.4 [re.alg.replace] before p. 3 as indicated:
8309 <blockquote><pre>template <class traits, class charT<ins>, class ST, class SA,
8310 class FST, class FSA</ins>>
8311 basic_string<charT<ins>, ST, SA</ins>>
8312 regex_replace(const basic_string<charT<ins>, ST, SA</ins>>& s,
8313 const basic_regex<charT, traits>& e,
8314 const basic_string<charT<ins>, FST, FSA</ins>>& fmt,
8315 regex_constants::match_flag_type flags =
8316 regex_constants::match_default);
8319 template <class traits, class charT, class ST, class SA>
8320 basic_string<charT, ST, SA>
8321 regex_replace(const basic_string<charT, ST, SA>& s,
8322 const basic_regex<charT, traits>& e,
8324 regex_constants::match_flag_type flags =
8325 regex_constants::match_default);
8329 <i>Effects:</i> Constructs an empty string result of type <tt>basic_string<charT<ins>,
8330 ST, SA</ins>></tt>, calls <tt>regex_replace(back_inserter(result), s.begin(), s.end(),
8331 e, fmt, flags)</tt>, and then returns <tt>result</tt>.
8338 At the end of 28.11.4 [re.alg.replace] add the following new prototype description:
8341 <blockquote><pre><ins>
8342 template <class traits, class charT, class ST, class SA>
8343 basic_string<charT>
8344 regex_replace(const charT* s,
8345 const basic_regex<charT, traits>& e,
8346 const basic_string<charT, ST, SA>& fmt,
8347 regex_constants::match_flag_type flags =
8348 regex_constants::match_default);
8352 template <class traits, class charT>
8353 basic_string<charT>
8354 regex_replace(const charT* s,
8355 const basic_regex<charT, traits>& e,
8357 regex_constants::match_flag_type flags =
8358 regex_constants::match_default);
8363 <i>Effects:</i> Constructs an empty string result of type <tt>basic_string<charT></tt>,
8364 calls <tt>regex_replace(back_inserter(result), s, s +
8365 char_traits<charT>::length(s),
8366 e, fmt, flags)</tt>, and then returns <tt>result</tt>.
8381 <h3><a name="742"></a>742. Enabling <tt>swap</tt> for proxy iterators</h3>
8382 <p><b>Section:</b> X [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
8383 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2007-10-10 <b>Last modified:</b> 2009-07-28</p>
8384 <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>
8385 <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>
8386 <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>
8387 <p><b>Discussion:</b></p>
8389 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
8390 deals with changing the requirements of <tt>T</tt> in the <tt>Swappable</tt>
8391 requirement from <tt>CopyConstructible</tt> and <tt>CopyAssignable</tt> to
8392 <tt>MoveConstructible</tt> and <tt>MoveAssignable</tt>.
8396 This issue seeks to widen the <tt>Swappable</tt> requirement to support proxy iterators. Here
8400 <blockquote><pre>namespace Mine {
8402 template <class T>
8405 template <class T>
8406 struct proxied_iterator
8408 typedef T value_type;
8409 typedef proxy<T> reference;
8410 reference operator*() const;
8416 // heavy type, has an optimized swap, maybe isn't even copyable or movable, just swappable
8421 void swap(A&, A&);
8422 void swap(proxy<A>, A&);
8423 void swap(A&, proxy<A>);
8424 void swap(proxy<A>, proxy<A>);
8430 Mine::proxied_iterator<Mine::A> i(...)
8432 <b>swap(*i1, a);</b>
8436 The key point to note in the above code is that in the call to <tt>swap</tt>, <tt>*i1</tt>
8437 and <tt>a</tt> are different types (currently types can only be <tt>Swappable</tt> with the
8438 same type). A secondary point is that to support proxies, one must be able to pass rvalues
8439 to <tt>swap</tt>. But note that I am not stating that the general purpose <tt>std::swap</tt>
8440 should accept rvalues! Only that overloaded <tt>swap</tt>s, as in the example above, be allowed
8445 That is, no standard library code needs to change. We simply need to have a more flexible
8446 definition of <tt>Swappable</tt>.
8456 While we believe Concepts work will define a swappable concept, we
8457 should still resolve this issue if possible to give guidance to the
8461 Would an ambiguous swap function in two namespaces found by ADL break
8462 this wording? Suggest that the phrase "valid expression" means such a
8463 pair of types would still not be swappable.
8466 Motivation is proxy-iterators, but facility is considerably more
8467 general. Are we happy going so far?
8470 We think this wording is probably correct and probably an improvement on
8471 what's there in the WP. On the other hand, what's already there in the
8472 WP is awfully complicated. Why do we need the two bullet points? They're
8473 too implementation-centric. They don't add anything to the semantics of
8474 what swap() means, which is there in the post-condition. What's wrong
8475 with saying that types are swappable if you can call swap() and it
8476 satisfies the semantics of swapping?
8481 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
8487 <p><b>Proposed resolution:</b></p>
8489 Change X [utility.arg.requirements]:
8495 -1- The template definitions in the C++ Standard Library refer to various
8496 named requirements whose details are set out in tables 31-38. In these
8497 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
8498 instantiating a template; <tt>a</tt>, <tt>b</tt>, and <tt>c</tt> are
8499 values of type <tt>const T</tt>; <tt>s</tt> and <tt>t</tt> are modifiable
8500 lvalues of type <tt>T</tt>; <tt>u</tt> is a value of type (possibly
8501 <tt>const</tt>) <tt>T</tt>; <del>and</del> <tt>rv</tt> is a non-<tt>const</tt>
8502 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>.
8506 <caption>Table 37: <tt>Swappable</tt> requirements <b>[swappable]</b></caption>
8507 <tbody><tr><th>expression</th><th>return type</th><th>post-condition</th></tr>
8508 <tr><td><tt>swap(<del>s</del><ins>w</ins>,<del>t</del><ins>v</ins>)</tt></td><td><tt>void</tt></td>
8509 <td><del><tt>t</tt></del><ins><tt>w</tt></ins> has the value originally
8510 held by <del><tt>u</tt></del><ins><tt>v</tt></ins>, and
8511 <del><tt>u</tt></del><ins><tt>v</tt></ins> has the value originally held
8512 by <del><tt>t</tt></del><ins><tt>w</tt></ins></td></tr>
8513 <tr><td colspan="3">
8515 The <tt>Swappable</tt> requirement is met by satisfying one or more of the following conditions:
8519 <tt>T</tt> is <tt>Swappable</tt> if <ins><tt>T</tt> and <tt>V</tt> are
8520 the same type and </ins> <tt>T</tt> satisfies the
8521 <del><tt>CopyConstructible</tt></del>
8522 <ins><tt>MoveConstructible</tt></ins> requirements (Table <del>34</del>
8523 <ins>33</ins>) and the <del><tt>CopyAssignable</tt></del>
8524 <ins><tt>MoveAssignable</tt></ins> requirements (Table <del>36</del>
8528 <tt>T</tt> is <tt>Swappable</tt> <ins>with <tt>V</tt></ins> if a namespace scope function named
8529 <tt>swap</tt> exists in the same namespace as the definition of
8530 <tt>T</tt> <ins>or <tt>V</tt></ins>, such that the expression
8531 <tt>swap(<del>t</del><ins>w</ins>,<del>u</del> <ins>v</ins>)</tt> is valid and has the
8532 semantics described in this table.
8541 <p><b>Rationale:</b></p>
8549 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/N2758.pdf">N2758</a>.
8558 <h3><a name="774"></a>774. Member swap undefined for most containers</h3>
8559 <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>
8560 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-01-14 <b>Last modified:</b> 2009-07-30</p>
8561 <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>
8562 <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>
8563 <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>
8564 <p><b>Discussion:</b></p>
8566 It appears most containers declare but do not define a member-swap
8571 This is unfortunate, as all overload the <tt>swap</tt> algorithm to call the
8572 member-swap function!
8573 (required for <tt>swappable</tt> guarantees [Table 37] and Container Requirements
8578 Note in particular that Table 87 gives semantics of <tt>a.swap(b)</tt> as <tt>swap(a,b)</tt>,
8579 yet for all containers we define <tt>swap(a,b)</tt> to call <tt>a.swap(b)</tt> - a circular
8584 A quick survey of clause 23 shows that the following containers provide a
8585 definition for member-swap:
8588 <blockquote><pre>array
8595 Whereas the following declare it, but do not define the semantics:
8598 <blockquote><pre>deque
8612 Suggested resolution:
8615 Provide a definition for each of the affected containers...
8624 Move to Open and ask Alisdair to provide wording.
8633 Daniel to provide wording.
8634 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2590.pdf">N2590</a>
8635 is no longer applicable.
8639 2009-07-28 Daniel provided wording.
8646 It assumes that the proposed resolution for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#883">883</a> is applied,
8647 which breaks the circularity of definition between member
8648 <tt>swap</tt> and free <tt>swap</tt>.
8652 It uses the notation of the pre-concept allocator trait
8653 <tt>allocator_propagation_map</tt>, which might be renamed after the
8654 next refactoring phase of generalized allocators.
8658 It requires that compare objects, key equal functions and
8659 hash functions in containers are swapped via unqualified free
8660 <tt>swap</tt> according to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#594">594</a>.
8666 <p><b>Proposed resolution:</b></p>
8670 Add a new Throws clause just after X [allocator.propagation.map]/5:
8673 <blockquote><pre>static void swap(Alloc& a, Alloc& b);
8677 <i>Effects:</i> [..]
8681 <ins><i>Throws:</i> Nothing.</ins>
8686 This exception requirement is added, such that it's combination with the
8687 general container requirements of
8688 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf">N2723</a>
8689 [container.requirements.general]/9
8690 make it unambiguously clear that the following descriptions of "swaps the
8691 allocators" have the following meaning: (a) This swap is done by calling
8692 <tt>allocator_propagation_map<allocator_type>::swap</tt> and (b) This allocator
8693 swap does never propagate an exception
8700 Change 23.2.4.1 [associative.reqmts.except]/3 as indicated:
8704 For associative containers, no <tt>swap</tt> function throws an exception unless that
8705 exception is thrown by the <del>copy constructor or copy assignment
8707 <ins><tt>swap</tt></ins> of the container's <tt>Pred</tt> object<ins>s</ins><del> (if any)</del>.
8713 Change 23.2.5.1 [unord.req.except]/3 as indicated:
8717 For unordered associative containers, no <tt>swap</tt> function throws an
8719 that exception is thrown by the <del>copy constructor or copy
8720 assignment operator</del>
8721 <ins><tt>swap</tt></ins> of the container's <tt>Hash</tt> or <tt>Pred</tt> object<ins>s,
8722 respectively</ins><del> (if any)</del>.
8728 Insert a new paragraph just after 23.3 [sequences]/1:
8732 <ins>In addition to being available via inclusion of the <tt><algorithm></tt> header,
8733 the <tt>swap</tt> function templates in 25.4.3 [alg.swap] are also available when the
8734 header <tt><queue></tt> is included.</ins>
8738 There is a new issue in process that will suggest a minimum header for <tt>swap</tt>
8739 and <tt>move</tt>. If this one is provided, this text can be removed and the header
8740 dependency should be added to <tt><queue></tt>
8748 Add one further clause at the end of 23.3.1.2 [array.special]:
8750 <p><i>[This part is added, because otherwise <tt>array::swap</tt> would otherwise
8752 general contract of 23.2.1 [container.requirements.general] p. 10 b. 5]</i></p>
8756 <ins><i>Throws:</i> Nothing, unless one of the element-wise <tt>swap</tt> calls throws
8765 In 23.3.2 [deque], class template deque synopsis change as indicated:
8767 <blockquote><pre>void swap(deque<del><T,Alloc></del>&);
8773 At the end of 23.3.2.3 [deque.modifiers] add as indicated:
8776 <blockquote><pre><ins>void swap(deque& x);</ins>
8780 <ins><i>Effects:</i> Exchanges the contents and swaps the allocators of <tt>*this</tt>
8781 with that of <tt>x</tt>.</ins>
8784 <ins><i>Complexity:</i> Constant time.</ins>
8796 In 23.3.3 [forwardlist], class template <tt>forward_list</tt> synposis change as indicated:
8799 <blockquote><pre>void swap(forward_list<del><T,Allocator></del>&);
8805 At the end of 23.3.3.4 [forwardlist.modifiers] add as indicated:
8808 <blockquote><pre><ins>void swap(forward_list& x);</ins>
8812 <ins><i>Effects:</i> Exchanges the contents and swaps the allocators of <tt>*this</tt>
8813 with that of <tt>x</tt>.</ins>
8816 <ins><i>Complexity:</i> Constant time.</ins>
8828 In 23.3.4 [list], class template <tt>list</tt> synopsis change as indicated:
8831 <blockquote><pre>void swap(list<del><T,Allocator></del>&);
8837 At the end of 23.3.4.3 [list.modifiers] add as indicated:
8840 <blockquote><pre><ins>void swap(list& x);</ins>
8845 <ins><i>Effects:</i> Exchanges the contents and swaps the allocators of <tt>*this</tt>
8846 with that of <tt>x</tt>.</ins>
8850 <ins><i>Complexity:</i> Constant time.</ins>
8860 At the end of 23.3.5.2.2 [priqueue.members] add a new prototype description:
8863 <blockquote><pre><ins>void swap(priority_queue& q);</ins>
8867 <ins><i>Requires:</i> <tt>Compare</tt> shall satisfy the <tt>Swappable</tt> requirements
8868 ( [swappable]).</ins>
8872 This requirement is added to ensure that even a user defined <tt>swap</tt>
8874 ADL for <tt>Compare</tt> satisfies the <tt>Swappable</tt> requirements
8879 <ins><i>Effects:</i> <tt>this->c.swap(q.c); swap(this->comp, q.comp);</tt></ins>
8882 <ins><i>Throws:</i> What and if <tt>c.swap(q.c)</tt> and <tt>swap(comp, q.comp)</tt> throws.</ins>
8887 This part is added, because otherwise <tt>priority_queue::swap</tt> would otherwise
8888 contradict the general contract of 23.2.1 [container.requirements.general] p. 10 b. 5
8897 In 23.3.6 [vector], class template <tt>vector</tt> synopsis change as indicated:
8900 <blockquote><pre>void swap(vector<del><T,Allocator></del>&);
8906 Change 23.3.6.2 [vector.capacity]/8 as indicated:
8909 <blockquote><pre>void swap(vector<del><T,Allocator></del>& x);
8913 <i>Effects:</i> Exchanges the contents and <tt>capacity()</tt> <ins>and swaps the
8915 of <tt>*this</tt> with that of <tt>x</tt>.
8924 Insert a new paragraph just before 23.4 [associative]/1:
8928 <ins>In addition to being available via inclusion of the <tt><algorithm></tt> header,
8929 the <tt>swap</tt> function templates in 25.4.3 [alg.swap] are also available when any of the
8930 headers <tt><map></tt> or <tt><set></tt> are included.</ins>
8938 In 23.4.1 [map], class template <tt>map</tt> synopsis change as indicated:
8941 <blockquote><pre>void swap(map<del><Key,T,Compare,Allocator></del>&);
8947 At the end of 23.4.1.3 [map.modifiers] add as indicated:
8950 <blockquote><pre><ins>void swap(map& x);</ins>
8955 <ins><i>Requires:</i> Compare shall satisfy the <tt>Swappable</tt> requirements
8956 ( [swappable]).</ins>
8960 This requirement is added to ensure that even a user defined <tt>swap</tt>
8961 which is found by ADL for <tt>Compare</tt> satisfies the <tt>Swappable</tt>
8967 <ins><i>Effects:</i> Exchanges the contents and swaps the allocators of <tt>*this</tt>
8968 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the comparison objects
8969 of <tt>*this</tt> and <tt>x</tt>.</ins>
8973 <ins><i>Complexity:</i> Constant time</ins>
8985 In 23.4.2 [multimap], class template <tt>multimap</tt> synopsis change as indicated:
8988 <blockquote><pre>void swap(multimap<del><Key,T,Compare,Allocator></del>&);
8994 At the end of 23.4.2.2 [multimap.modifiers] add as indicated:
8997 <blockquote><pre><ins>void swap(multimap& x);</ins>
9002 <ins><i>Requires:</i> Compare shall satisfy the <tt>Swappable</tt> requirements
9003 ( [swappable]).</ins>
9006 <ins><i>Effects:</i> Exchanges the contents and swaps the allocators of <tt>*this</tt>
9007 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the comparison objects
9008 of <tt>*this</tt> and <tt>x</tt>.</ins>
9011 <ins><i>Complexity:</i> Constant time</ins>
9023 In 23.4.3 [set], class template <tt>set</tt> synopsis change as indicated:
9026 <blockquote><pre>void swap(set<del><Key,Compare,Allocator></del>&);
9032 After section 23.4.3.1 [set.cons] add a new section <ins><tt>set</tt> modifiers
9033 [set.modifiers]</ins>
9034 and add the following paragraphs:
9037 <blockquote><pre><ins>void swap(set& x);</ins>
9042 <ins><i>Requires:</i> Compare shall satisfy the <tt>Swappable</tt> requirements
9043 ( [swappable]).</ins>
9047 <ins><i>Effects:</i> Exchanges the contents and swaps the allocators of <tt>*this</tt>
9048 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the comparison objects
9049 of <tt>*this</tt> and <tt>x</tt>.</ins>
9053 <ins>Complexity: Constant time</ins>
9065 In 23.4.4 [multiset], class template <tt>multiset</tt> synosis, change as indicated:
9068 <blockquote><pre>void swap(multiset<del><Key,Compare,Allocator></del>&);
9074 After section 23.4.4.1 [multiset.cons] add a new section <ins><tt>multiset</tt> modifiers
9075 [multiset.modifiers]</ins> and add the following paragraphs:
9078 <blockquote><pre><ins>void swap(multiset& x);</ins>
9083 <ins><i>Requires:</i> Compare shall satisfy the <tt>Swappable</tt> requirements
9084 ( [swappable]).</ins>
9088 <ins><i>Effects:</i> Exchanges the contents and swaps the allocators of <tt>*this</tt>
9089 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the comparison objects
9090 of <tt>*this</tt> and <tt>x</tt>.</ins>
9094 <ins><i>Complexity:</i> Constant time</ins>
9104 Insert a new paragraph just before 23.5 [unord]/1:
9108 <ins>In addition to being available via inclusion of the <tt><algorithm></tt> header,
9109 the <tt>swap</tt> function templates in 25.4.3 [alg.swap] are also available when any of the
9110 headers <tt><unordered_map></tt> or <tt><unordered_set></tt> are included.</ins>
9117 After section 23.5.1.2 [unord.map.elem] add a new section <ins>unordered_map
9118 modifiers [unord.map.modifiers]</ins> and add the following paragraphs:
9121 <blockquote><pre><ins>void swap(unordered_map& x);</ins>
9126 <ins><i>Requires:</i> <tt>Hash</tt> and <tt>Pred</tt> shall satisfy the <tt>Swappable</tt> requirements
9127 ( [swappable]).</ins>
9131 This requirement is added to ensure that even a user defined <tt>swap</tt>
9132 which is found by ADL for <tt>Hash</tt> and <tt>Pred</tt> satisfies the <tt>Swappable</tt>
9138 <ins><i>Effects:</i> Exchanges the contents and hash policy and swaps the
9139 allocators of <tt>*this</tt>
9140 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the <tt>Pred</tt> objects
9141 and an unqualified <tt>swap</tt> of the <tt>Hash</tt> objects of <tt>*this</tt> and <tt>x</tt>.</ins>
9145 <ins><i>Complexity:</i> Constant time</ins>
9153 After section 23.5.2.1 [unord.multimap.cnstr] add a new section
9154 <ins>unordered_multimap
9155 modifiers [unord.multimap.modifiers]</ins> and add the following paragraphs:
9158 <blockquote><pre><ins>void swap(unordered_multimap& x);</ins>
9163 <ins><i>Requires:</i> <tt>Hash</tt> and <tt>Pred</tt> shall satisfy the <tt>Swappable</tt> requirements
9164 ( [swappable]).</ins>
9168 <ins><i>Effects:</i> Exchanges the contents and hash policy and swaps the
9169 allocators of <tt>*this</tt>
9170 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the <tt>Pred</tt> objects
9171 and an unqualified <tt>swap</tt> of the <tt>Hash</tt> objects of <tt>*this</tt> and <tt>x</tt></ins>
9174 <ins><i>Complexity:</i> Constant time</ins>
9182 After section 23.5.3.1 [unord.set.cnstr] add a new section
9183 <ins>unordered_set modifiers
9184 [unord.set.modifiers]</ins> and add the following paragraphs:
9187 <blockquote><pre><ins>void swap(unordered_set& x);</ins>
9192 <ins><i>Requires:</i> <tt>Hash</tt> and <tt>Pred</tt> shall satisfy the <tt>Swappable</tt> requirements
9193 ( [swappable]).</ins>
9197 <ins><i>Effects:</i> Exchanges the contents and hash policy and swaps the
9198 allocators of <tt>*this</tt>
9199 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the <tt>Pred</tt> objects
9200 and an unqualified <tt>swap</tt> of the <tt>Hash</tt> objects of <tt>*this</tt> and <tt>x</tt></ins>
9204 <ins><i>Complexity:</i> Constant time</ins>
9212 After section 23.5.4.1 [unord.multiset.cnstr] add a new section
9213 <ins>unordered_multiset
9214 modifiers [unord.multiset.modifiers]</ins> and add the following paragraphs:
9217 <blockquote><pre><ins>void swap(unordered_multiset& x);</ins>
9222 <ins><i>Requires:</i> <tt>Hash</tt> and <tt>Pred</tt> shall satisfy the <tt>Swappable</tt> requirements
9223 ( [swappable]).</ins>
9227 <ins><i>Effects:</i> Exchanges the contents and hash policy and swaps the
9228 allocators of <tt>*this</tt>
9229 with that of <tt>x</tt>, followed by an unqualified <tt>swap</tt> of the <tt>Pred</tt> objects
9230 and an unqualified <tt>swap</tt> of the <tt>Hash</tt> objects of <tt>*this</tt> and <tt>x</tt></ins>
9233 <ins><i>Complexity:</i> Constant time</ins>
9247 <h3><a name="780"></a>780. <tt>std::merge()</tt> specification incorrect/insufficient</h3>
9248 <p><b>Section:</b> 25.5.4 [alg.merge] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
9249 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-01-25 <b>Last modified:</b> 2009-07-16</p>
9250 <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>
9251 <p><b>Discussion:</b></p>
9253 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:
9257 Both 25.3.4 [lib.alg.merge] in 14882:2003 and 25.5.4 [alg.merge] in N2461
9258 have no Requires element and the Effects element contains some requirements,
9259 which is probably editorial. Worse is that:
9264 no assignment requirements are specified (neither implicit nor explicit).
9268 the effects clause just speaks of "merges", which is badly worded
9269 near to a circular definition.
9273 p. 2 mentions a range <tt>[first, last)</tt>, which is not defined by the
9274 function arguments or otherwise.
9278 p. 2 says "according to the ordering defined by comp" which is both
9280 this excludes the first variant with <) and redundant (because the
9281 following subordinate
9282 clause mentions comp again)
9287 Post Summit Alisdair adds:
9296 (where <tt>last</tt> is equal to <tt>next(result, distance(first1, last1) +
9297 distance(first2, last2))</tt>, such that resulting range will be sorted in
9298 non-decreasing order; that is, for every iterator <tt>i</tt> in <tt>[result,last)</tt> other
9299 than <tt>result</tt>, the condition <tt>*i < *prev(i)</tt> or, respectively, <tt>comp(*i,
9300 *prev(i))</tt> will be <tt>false</tt>.
9304 Note that this might still not be technically accurate in the case of
9305 <tt>InputIterators</tt>, depending on other resolutions working their way through the
9306 system (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1011">1011</a>).
9311 Post Summit Daniel adds:
9316 If we want to use <tt>prev</tt> and <tt>next</tt> here (Note: <tt>merge</tt>
9317 is sufficiently satisfied with <tt>InputIterator</tt>) we should instead *add* more to
9318 25 [algorithms]/6, but I can currently not propose any good wording for this.
9327 Pete points out the existing wording in [algorithms]/4
9328 that permits the use of + in algorithm specifications.
9331 Alisdair points out that that wording may not apply to input iterators.
9349 <p><b>Proposed resolution:</b></p>
9351 In 25.5.4 [alg.merge] replace p.1+ 2:
9356 <i>Effects:</i> <del>Merges</del> <ins>Copies all the elements of the</ins> two sorted ranges <tt>[first1,last1)</tt> and
9357 <tt>[first2,last2)</tt> into the range
9358 <del><tt>[result,result + (last1 - first1) + (last2 - first2))</tt></del>
9359 <ins><tt>[result, last)</tt> (where <tt>last</tt> is equal to <tt>result + (last1
9360 - first1) + (last2 - first2))</tt>, such that resulting range will be
9361 sorted in non-decreasing order; that is, for every iterator <tt>i</tt> in
9362 <tt>[result,last)</tt> other than <tt>result</tt>, the condition <tt>*i < *(i - 1)</tt> or,
9363 respectively, <tt>comp(*i, *(i - 1))</tt> will be false</ins>.
9367 <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
9368 order according to the ordering defined by <tt>comp</tt>; that is, for every iterator <tt>i</tt> in
9369 <tt>[first,last)</tt> other than <tt>first</tt>, the condition <tt>*i < *(i - 1)</tt> or
9370 <tt>comp(*i, *(i - 1))</tt> will be false.</del>
9375 [N.B.: I attempted to reuse the wording style of <tt>inplace_merge</tt>,
9376 therefore proposing to
9377 insert ", respectively," between both predicate tests. This is no
9378 strictly necessary as
9379 other parts of <tt><algorithm></tt> show, just a matter of consistency]
9388 <h3><a name="788"></a>788. ambiguity in [istream.iterator]</h3>
9389 <p><b>Section:</b> 24.6.1 [istream.iterator] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
9390 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2008-02-06 <b>Last modified:</b> 2009-07-16</p>
9391 <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>
9392 <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>
9393 <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>
9394 <p><b>Discussion:</b></p>
9396 <p><b>Addresses UK 287</b></p>
9400 It is not clear what the initial state of an <tt>istream_iterator</tt> should be. Is
9401 _value_ initialized by reading the stream, or default/value initialized? If
9402 it is initialized by reading the stream, what happens if the initialization
9403 is deferred until first dereference, when ideally the iterator value should
9404 have been that of an end-of-stream iterator which is not safely
9409 Recommendation: Specify _value_ is initialized by reading the stream, or
9410 the iterator takes on the end-of-stream value if the stream is empty.
9415 The description of how an istream_iterator object becomes an
9416 end-of-stream iterator is a) ambiguous and b) out of date WRT
9417 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#468">468</a>:
9421 <tt>istream_iterator</tt> reads (using <tt>operator>></tt>) successive elements from the
9422 input stream for which it was constructed. After it is constructed, and
9423 every time <tt>++</tt> is used, the iterator reads and stores a value of <tt>T</tt>. If
9424 the end of stream is reached (<tt>operator void*()</tt> on the stream returns
9425 <tt>false</tt>), the iterator becomes equal to the <i>end-of-stream</i> iterator value.
9426 The constructor with no arguments <tt>istream_iterator()</tt> always constructs
9427 an end of stream input iterator object, which is the only legitimate
9428 iterator to be used for the end condition. The result of <tt>operator*</tt> on an
9429 end of stream is not defined. For any other iterator value a <tt>const T&</tt> is
9430 returned. The result of <tt>operator-></tt> on an end of stream is not defined.
9431 For any other iterator value a <tt>const T*</tt> is returned. It is impossible to
9432 store things into istream iterators. The main peculiarity of the istream
9433 iterators is the fact that <tt>++</tt> operators are not equality preserving,
9434 that is, <tt>i == j</tt> does not guarantee at all that <tt>++i == ++j</tt>. Every time <tt>++</tt>
9435 is used a new value is read.
9439 <tt>istream::operator void*()</tt> returns null if <tt>istream::fail()</tt> is <tt>true</tt>,
9440 otherwise non-null. <tt>istream::fail()</tt> returns <tt>true</tt> if <tt>failbit</tt> or
9441 <tt>badbit</tt> is set in <tt>rdstate()</tt>. Reaching the end of stream doesn't
9442 necessarily imply that <tt>failbit</tt> or <tt>badbit</tt> is set (e.g., after
9443 extracting an <tt>int</tt> from <tt>stringstream("123")</tt> the stream object will
9444 have reached the end of stream but <tt>fail()</tt> is <tt>false</tt> and <tt>operator
9445 void*()</tt> will return a non-null value).
9449 Also I would prefer to be explicit about calling <tt>fail()</tt> here
9450 (there is no <tt>operator void*()</tt> anymore.)
9459 Moved from Ready to Open for the purposes of using this issue to address NB UK 287.
9470 This improves the wording.
9479 <p><b>Proposed resolution:</b></p>
9481 Change 24.6.1 [istream.iterator]/1:
9485 <tt>istream_iterator</tt> reads (using <tt>operator>></tt>) successive elements from the
9486 input stream for which it was constructed. After it is constructed, and
9487 every time <tt>++</tt> is used, the iterator reads and stores a value of <tt>T</tt>. If
9488 <del>the end of stream is reached</del> <ins>the iterator fails to read and store a value of <tt>T</tt></ins>
9489 (<tt><del>operator void*()</del> <ins>fail()</ins></tt> on the stream returns
9490 <tt><del>false</del> <ins>true</ins></tt>), the iterator becomes equal to the <i>end-of-stream</i> iterator value.
9491 The constructor with no arguments <tt>istream_iterator()</tt> always constructs
9492 an end of stream input iterator object, which is the only legitimate
9493 iterator to be used for the end condition. The result of <tt>operator*</tt> on an
9494 end of stream is not defined. For any other iterator value a <tt>const T&</tt> is
9495 returned. The result of <tt>operator-></tt> on an end of stream is not defined.
9496 For any other iterator value a <tt>const T*</tt> is returned. It is impossible to
9497 store things into istream iterators. The main peculiarity of the istream
9498 iterators is the fact that <tt>++</tt> operators are not equality preserving,
9499 that is, <tt>i == j</tt> does not guarantee at all that <tt>++i == ++j</tt>. Every time <tt>++</tt>
9500 is used a new value is read.
9508 <h3><a name="801"></a>801. <tt>tuple</tt> and <tt>pair</tt> trivial members</h3>
9509 <p><b>Section:</b> 20.5 [tuple] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9510 <b>Submitter:</b> Lawrence Crowl <b>Opened:</b> 2008-02-18 <b>Last modified:</b> 2009-07-20</p>
9511 <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>
9512 <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>
9513 <p><b>Discussion:</b></p>
9515 Classes with trivial special member functions are inherently more
9516 efficient than classes without such functions. This efficiency is
9517 particularly pronounced on modern ABIs that can pass small classes
9518 in registers. Examples include value classes such as complex numbers
9519 and floating-point intervals. Perhaps more important, though, are
9520 classes that are simple collections, like <tt>pair</tt> and <tt>tuple</tt>. When the
9521 parameter types of these classes are trivial, the <tt>pair</tt>s and <tt>tuple</tt>s
9522 themselves can be trivial, leading to substantial performance wins.
9525 The current working draft make specification of trivial functions
9526 (where possible) much easer through <tt>default</tt>ed and <tt>delete</tt>d functions.
9527 As long as the semantics of defaulted and deleted functions match
9528 the intended semantics, specification of defaulted and deleted
9529 functions will yield more efficient programs.
9532 There are at least two cases where specification of an explicitly
9533 defaulted function may be desirable.
9536 First, the <tt>std::pair</tt> template has a non-trivial default constructor,
9537 which prevents static initialization of the pair even when the
9538 types are statically initializable. Changing the definition to
9541 <blockquote><pre>pair() = default;
9545 would enable such initialization. Unfortunately, the change is
9546 not semantically neutral in that the current definition effectively
9547 forces value initialization whereas the change would not value
9548 initialize in some contexts.
9552 ** Does the committee confirm that forced value initialization
9553 was the intent? If not, does the committee wish to change the
9554 behavior of <tt>std::pair</tt> in C++0x?
9557 Second, the same default constructor issue applies to <tt>std::tuple</tt>.
9558 Furthermore, the <tt>tuple</tt> copy constructor is current non-trivial,
9559 which effectively prevents passing it in registers. To enable
9560 passing <tt>tuples</tt> in registers, the copy constructor should be
9561 make explicitly <tt>default</tt>ed. The new declarations are:
9564 <blockquote><pre>tuple() = default;
9565 tuple(const tuple&) = default;
9569 This changes is not implementation neutral. In particular, it
9570 prevents implementations based on pointers to the parameter
9571 types. It does however, permit implementations using the
9572 parameter types as bases.
9575 ** How does the committee wish to trade implementation
9576 efficiency versus implementation flexibility?
9586 General agreement; the first half of the issue is NAD.
9589 Before voting on the second half, it was agreed that a "Strongly Favor"
9590 vote meant support for trivial tuples (assuming usual requirements met),
9591 even at the expense of other desired qualities. A "Weakly Favor" vote
9592 meant support only if not at the expense of other desired qualities.
9595 Concensus: Go forward, but not at expense of other desired qualities.
9598 It was agreed to Alisdair should fold this work in with his other
9599 pair/tuple action items, above, and that issue 801 should be "open", but
9600 tabled until Alisdair's proposals are disposed of.
9605 2009-05-27 Daniel adds:
9610 This is partly solved by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1117">1117</a>.
9619 Wait for dust to settle from fixing exception safety problem
9624 2009-07-20 Alisdair adds:
9630 Basically, this issue is what should we do with the default constructor
9631 for pairs and tuples of trivial types. The motivation of the issue was
9632 to force static initialization rather than dynamic initialization, and
9633 was rejected in the case of pair as it would change the meaning of
9634 existing programs. The advice was "do the best we can" for tuple
9635 without changing existing meaning.
9639 Frankfurt seems to simply wait and see the resolution on no-throw move
9640 constructors, which (I believe) is only tangentially related to this
9641 issue, but as good as any to defer until Santa Cruz.
9645 Looking again now, I think constant (static) initialization for pair can
9646 be salvaged by making the default construct constexpr. I have a
9647 clarification from Core that this is intended to work, even if the
9648 constructor is not trivial/constexpr, so long as no temporaries are
9649 implied in the process (even if elided).
9655 <p><b>Proposed resolution:</b></p>
9664 <h3><a name="811"></a>811. <tt>pair</tt> of pointers no longer works with literal 0</h3>
9665 <p><b>Section:</b> 20.3.3 [pairs] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9666 <b>Submitter:</b> Doug Gregor <b>Opened:</b> 2008-03-14 <b>Last modified:</b> 2009-07-28</p>
9667 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#pairs">active issues</a> in [pairs].</p>
9668 <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>
9669 <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>
9670 <p><b>Discussion:</b></p>
9671 <blockquote><pre>#include <utility>
9675 std::pair<char *, char *> p (0,0);
9680 I just got a bug report about that, because it's valid C++03, but not
9681 C++0x. The important realization, for me, is that the emplace
9682 proposal---which made <tt>push_back</tt> variadic, causing the <tt>push_back(0)</tt>
9683 issue---didn't cause this break in backward compatibility. The break
9684 actually happened when we added this pair constructor as part of adding
9685 rvalue references into the language, long before variadic templates or
9689 <blockquote><pre>template<class U, class V> pair(U&& x, V&& y);
9693 Now, concepts will address this issue by constraining that <tt>pair</tt>
9694 constructor to only <tt>U</tt>'s and <tt>V</tt>'s that can properly construct "first" and
9695 "second", e.g. (from
9696 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2322.pdf">N2322</a>):
9699 <blockquote><pre>template<class U , class V >
9700 requires Constructible<T1, U&&> && Constructible<T2, V&&>
9701 pair(U&& x , V&& y );
9711 Suggested to resolve using pass-by-value for that case.
9714 Side question: Should pair interoperate with tuples? Can construct a
9715 tuple of a pair, but not a pair from a two-element tuple.
9718 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#885">885</a>.
9723 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
9729 <p><b>Proposed resolution:</b></p>
9734 <p><b>Rationale:</b></p>
9742 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2770.pdf">N2770</a>.
9752 <h3><a name="815"></a>815. <tt>std::function</tt> and <tt>reference_closure</tt> do not use perfect forwarding</h3>
9753 <p><b>Section:</b> 20.7.16.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>
9754 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-03-16 <b>Last modified:</b> 2009-07-16</p>
9755 <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>
9756 <p><b>Discussion:</b></p>
9758 <tt>std::function</tt> and <tt>reference_closure</tt> should use "perfect forwarding" as
9759 described in the rvalue core proposal.
9768 According to Doug Gregor, as far as <tt>std::function</tt> is concerned, perfect
9769 forwarding can not be obtained because of type erasure. Not everyone
9770 agreed with this diagnosis of forwarding.
9774 2009-05-01 Howard adds:
9780 Sebastian Gesemann brought to my attention that the <tt>CopyConstructible</tt>
9781 requirement on <tt>function</tt>'s <tt>ArgTypes...</tt> is an unnecessary
9785 <blockquote><pre>template<Returnable R, <b>CopyConstructible</b>... ArgTypes>
9786 class function<R(ArgTypes...)>
9791 On further investigation, this complaint seemed to be the same
9792 issue as this one. I believe the reason <tt>CopyConstructible</tt> was put
9793 on <tt>ArgTypes</tt> in the first place was because of the nature of the
9794 <i>invoke</i> member:
9797 <blockquote><pre>template<class R, class ...ArgTypes>
9799 function<R(ArgTypes...)>::operator()(ArgTypes... arg) const
9802 throw bad_function_call();
9803 return (*f_)(arg...);
9808 However now with rvalue-refs, "by value" no longer implies <tt>CopyConstructible</tt>
9809 (as Sebastian correctly points out). If rvalue arguments are supplied, <tt>MoveConstructible</tt>
9810 is sufficient. Furthermore, the constraint need not be applied in <tt>function</tt>
9811 if I understand correctly. Rather the client must apply the proper constraints
9812 at the call site. Therefore, at the very least, I recommend that <tt>CopyConstructible</tt>
9813 be removed from the template class <tt>function</tt>.
9817 Furthermore we need to mandate that the <i>invoker</i> is coded as:
9820 <blockquote><pre>template<class R, class ...ArgTypes>
9822 function<R(ArgTypes...)>::operator()(ArgTypes... arg) const
9825 throw bad_function_call();
9826 return (*f_)(<b>std::forward<ArgTypes>(</b>arg<b>)</b>...);
9831 Note that <tt>ArgTypes&&</tt> (the "perfect forwarding signature") is not
9832 appropriate here as this is not a deduced context for <tt>ArgTypes</tt>. Instead
9833 the client's arguments must implicitly convert to the non-deduced <tt>ArgType</tt>
9834 type. Catching these arguments by value makes sense to enable decay.
9838 Next <tt>forward</tt> is used to move the <tt>ArgTypes</tt> as efficiently as
9839 possible, and also with minimum requirements (not <tt>CopyConstructible</tt>)
9840 to the type-erased functor. For object types, this will be a <tt>move</tt>. For
9841 reference type <tt>ArgTypes</tt>, this will be a copy. The end result <em>must</em> be
9842 that the following is a valid program:
9845 <blockquote><pre>#include <functional>
9846 #include <memory>
9847 #include <cassert>
9849 std::unique_ptr<int>
9850 f(std::unique_ptr<int> p, int& i)
9853 return std::move(p);
9859 std::function<std::unique_ptr<int>(std::unique_ptr<int>,
9861 std::unique_ptr<int> p = g(std::unique_ptr<int>(new int(1)), i);
9868 Tested in pre-concepts rvalue-ref-enabled compiler.
9873 In the example above, the first <tt>ArgType</tt> is <tt>unique_ptr<int></tt>
9874 and the second <tt>ArgType</tt> is <tt>int&</tt>. Both <em>must</em> work!
9880 2009-05-27 Daniel adds:
9886 in the 2009-05-01 comment of above mentioned issue Howard
9891 Recommends to replace the <tt>CopyConstructible</tt> requirement by a
9892 <tt>MoveConstructible</tt> requirement
9895 Says: "Furthermore, the constraint need not be applied in <tt>function</tt> if I
9896 understand correctly. Rather the client must apply the proper constraints
9901 I'm fine with (a), but I think comment (b) is incorrect, at least in the
9902 sense I read these sentences. Let's look at Howard's example code:
9905 <blockquote><pre>function<R(ArgTypes...)>::operator()(ArgTypes... arg) const
9908 throw bad_function_call();
9909 return (*f_)(std::forward<ArgTypes>(arg)...);
9914 In the constrained scope of this <tt>operator()</tt> overload the expression
9915 "<tt>(*f_)(std::forward<ArgTypes>(arg)...)</tt>" must be valid. How can it
9916 do so, if <tt>ArgTypes</tt> aren't at least <tt>MoveConstructible</tt>?
9926 Leave this open and wait until concepts are removed from the Working
9927 Draft so that we know how to write the proposed resolution in terms of
9928 diffs to otherwise stable text.
9933 <p><b>Proposed resolution:</b></p>
9942 <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>
9943 <p><b>Section:</b> 20.7.12.1.3 [func.bind.bind] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
9944 <b>Submitter:</b> Stephan T. Lavavej <b>Opened:</b> 2008-02-08 <b>Last modified:</b> 2009-07-16</p>
9945 <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>
9946 <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>
9947 <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>
9948 <p><b>Discussion:</b></p>
9950 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>
9951 should be nofail when <tt>f, t1, ..., tN</tt> have nofail copy ctors.
9954 However, no guarantees are provided for the copy ctor of the functor
9955 returned by <tt>bind()</tt>. (It's guaranteed to have a copy ctor, which can
9956 throw implementation-defined exceptions: <tt>bind()</tt> returns a forwarding
9957 call wrapper, TR1 3.6.3/2. A forwarding call wrapper is a call wrapper,
9958 TR1 3.3/4. Every call wrapper shall be CopyConstructible, TR1 3.3/4.
9959 Everything without an exception-specification may throw
9960 implementation-defined exceptions unless otherwise specified, C++03
9964 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
9965 to cover both calling <tt>bind()</tt> and copying the returned functor?
9974 <tt>tuple</tt> construction should probably have a similar guarantee.
9983 Howard to provide wording.
9987 Post Summit, Anthony provided wording.
9996 Part of all of this issue appears to be rendered moot
9997 by the proposed resolution to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#817">817</a> (q.v.).
9998 We recommend the issues be considered simultaneously
9999 (or possibly even merged)
10000 to ensure there is no overlap.
10001 Move to Open, and likewise for issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#817">817</a>.
10010 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#817">817</a> (see below). Leave Open.
10015 <p><b>Proposed resolution:</b></p>
10017 Add a new sentence to the end of paragraphs 2 and 4 of 20.7.12.1.3 [func.bind.bind]:
10022 -2- <i>Returns:</i> A forwarding call wrapper <tt>g</tt> with a weak result type (20.6.2). The effect of <tt>g(u1, u2,
10023 ..., uM)</tt> shall be <tt><i>INVOKE</i>(f, v1, v2, ..., vN, Callable<F cv,V1, V2, ..., VN>::result_type)</tt>, where <i>cv</i>
10024 represents the <i>cv</i>-qualifiers of <tt>g</tt> and the values and types of the bound arguments
10025 <tt>v1, v2, ..., vN</tt> are determined as specified below.
10026 <ins>The copy constructor and move constructor of the forwarding call wrapper shall throw an
10027 exception if and only if the corresponding constructor of <tt>F</tt> or any of the types
10028 in <tt>BoundArgs...</tt> throw an exception.</ins>
10032 -4- <i>Returns:</i> A forwarding call wrapper <tt>g</tt> with a nested type <tt>result_type</tt> defined as a synonym
10033 for <tt>R</tt>. The effect of <tt>g(u1, u2, ..., uM)</tt> shall be <tt><i>INVOKE</i>(f, v1, v2, ..., vN, R)</tt>, where the
10034 values and types of the bound arguments <tt>v1, v2, ..., vN</tt> are determined as specified below.
10035 <ins>The copy constructor and move constructor of the forwarding call wrapper shall throw an
10036 exception if and only if the corresponding constructor of <tt>F</tt> or any of the types
10037 in <tt>BoundArgs...</tt> throw an exception.</ins>
10047 <h3><a name="817"></a>817. <tt>bind</tt> needs to be moved</h3>
10048 <p><b>Section:</b> 20.7.12.1.3 [func.bind.bind] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10049 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2008-03-17 <b>Last modified:</b> 2009-07-16</p>
10050 <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>
10051 <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>
10052 <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>
10053 <p><b>Discussion:</b></p>
10054 <p><b>Addresses US 72, JP 38 and DE 21</b></p>
10057 The functor returned by <tt>bind()</tt> should have a move constructor that
10058 requires only move construction of its contained functor and bound arguments.
10059 That way move-only functors can be passed to objects such as <tt>thread</tt>.
10062 This issue is related to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#816">816</a>.
10070 <tt>bind</tt> should support move-only functors and bound arguments.
10079 add the move requirement for bind's return type.
10082 For example, assume following <tt>th1</tt> and <tt>th2</tt>,
10085 <blockquote><pre>void f(vector<int> v) { }
10087 vector<int> v{ ... };
10088 thread th1([v]{ f(v); });
10089 thread th2(bind(f, v));
10090 </pre></blockquote>
10093 When function object are set to thread, <tt>v</tt> is moved to <tt>th1</tt>'s lambda
10094 expression in a Move Constructor of lambda expression because <tt>th1</tt>'s lambda
10095 expression has a Move Constructor. But <tt>bind</tt> of <tt>th2</tt>'s
10096 return type doesn't have the requirement of Move, so it may not
10100 Add the requirement of move to get rid of this useless copy.
10103 And also, add the <tt>MoveConstructible</tt> as well as <tt>CopyConstructible</tt>.
10112 The specification for bind claims twice that "the values and types for
10113 the bound arguments v1, v2, ..., vN are determined as specified below".
10114 No such specification appears to exist.
10123 Howard to provide wording.
10127 Post Summit Alisdair and Howard provided wording.
10133 Several issues are being combined in this resolution. They are all touching the
10134 same words so this is an attempt to keep one issue from stepping on another, and
10135 a place to see the complete solution in one place.
10140 <tt>bind</tt> needs to be "moved".
10143 20.7.12.1.3 [func.bind.bind]/p3, p6 and p7 were accidently removed from N2798.
10146 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#929">929</a> argues for a way to pass by && for
10147 efficiency but retain the decaying behavior of pass by value for the
10148 <tt>thread</tt> constructor. That same solution is applicable here.
10159 We were going to recommend moving this issue to Tentatively Ready
10160 until we noticed potential overlap with issue 816 (q.v.).
10164 and recommend both issues be considered together
10165 (and possibly merged).
10175 The proposed resolution uses concepts. Leave Open.
10180 <p><b>Proposed resolution:</b></p>
10182 Change 20.7 [function.objects] p2:
10185 <blockquote><pre>template<<del>CopyConstructible</del> <ins>MoveConstructible</ins> Fn, <del>CopyConstructible</del> <ins>MoveConstructible</ins>... Types>
10186 <i>unspecified</i> bind(Fn<ins>&&</ins>, Types<ins>&&</ins>...);
10187 template<Returnable R, <del>CopyConstructible</del> <ins>MoveConstructible</ins> Fn, <del>CopyConstructible</del> <ins>MoveConstructible</ins>... Types>
10188 <i>unspecified</i> bind(Fn<ins>&&</ins>, Types<ins>&&</ins>...);
10189 </pre></blockquote>
10192 Change 20.7.12.1.3 [func.bind.bind]:
10195 <blockquote><pre>template<<del>CopyConstructible</del> <ins>MoveConstructible</ins> F, <del>CopyConstructible</del> <ins>MoveConstructible</ins>... BoundArgs>
10196 <i>unspecified</i> bind(F<ins>&&</ins> f, BoundArgs<ins>&&</ins>... bound_args);
10201 <ins><i>Requires:</i> <i>unspecified</i> return type shall be <tt>MoveConstructible</tt>.</ins>
10204 -1- <i>Requires:</i> <tt><i>INVOKE</i>(f, w1, w2, ..., wN)</tt> (20.6.2) shall be a valid expression for some values
10205 <i>w1, w2, ..., wN</i>, where <tt>N == sizeof...(bound_args)</tt>.
10208 -2- <i>Returns:</i> A forwarding call wrapper <tt>g</tt> with a weak result type (20.6.2). The effect of <tt>g(u1, u2,
10209 ..., uM)</tt> shall be <tt><i>INVOKE</i>(f, v1, v2, ..., vN, Callable<F cv,V1, V2, ..., VN>::result_type)</tt>, where <i>cv</i>
10210 represents the <i>cv</i>-qualifiers of <tt>g</tt> and the values and types of the bound arguments
10211 <tt>v1, v2, ..., vN</tt> are determined as specified below.
10214 <i>Throws:</i> Nothing unless the constructor of <tt>F</tt> or of one of the types in the <tt>BoundArgs...</tt> pack expansion
10215 throws an exception.
10219 <pre>template<Returnable R, <del>CopyConstructible</del> <ins>MoveConstructible</ins> F, <del>CopyConstructible</del> <ins>MoveConstructible</ins>... BoundArgs>
10220 <i>unspecified</i> bind(F<ins>&&</ins> f, BoundArgs<ins>&&</ins>... bound_args);
10225 <ins><i>Requires:</i> <i>unspecified</i> return type shall be <tt>MoveConstructible</tt>.</ins>
10228 -3- <i>Requires:</i> <tt><i>INVOKE</i>(f, w1, w2, ..., wN)</tt> shall be a valid expression for some values <i>w1, w2, ...,
10229 wN</i>, where <tt>N == sizeof...(bound_args)</tt>.
10232 -4- <i>Returns:</i> A forwarding call wrapper <tt>g</tt> with a nested type <tt>result_type</tt> defined as a synonym
10233 for <tt>R</tt>. The effect of <tt>g(u1, u2, ..., uM)</tt> shall be <tt><i>INVOKE</i>(f, v1, v2, ..., vN, R)</tt>, where the
10234 values and types of the bound arguments <tt>v1, v2, ..., vN</tt> are determined as specified below.
10238 <i>Throws:</i> Nothing unless the constructor of <tt>F</tt> or of one of the types in the <tt>BoundArgs...</tt> pack expansion
10239 throws an exception.
10245 Let the values of <i>bound arguments</i> <tt>v1, v2, ..., vN</tt> and
10246 their corresponding types <tt>V1, V2, ..., VN</tt> depend on the type of
10247 the corresponding argument <tt>ti</tt> in <tt>bound_args</tt> in the
10248 call to <tt>bind</tt> and the <i>cv</i>-qualifiers <i>cv</i> of the call
10249 wrapper <tt>g</tt> as follows. Let <tt>Ti</tt> be an alias for the ith
10250 element of the pack expansion <tt>decay<BoundArgs>::type...</tt>,
10251 and let <tt>ti</tt> be an alias for the ith element in the function
10252 parameter pack expansion <tt>bound_args...</tt>:
10257 if <tt>ti</tt> is of type <tt>reference_wrapper<T></tt> the argument is
10258 <tt>ti.get()</tt> and its type <tt>Vi</tt> is <tt>T&</tt>;
10261 if the value of <tt>std::is_bind_expression<Ti>::value</tt> is <tt>true</tt> the argument is <tt>ti(u1, u2, ..., uM)</tt> and
10262 its type <tt>Vi</tt> is <tt>result_of<Ti cv (U1&, U2&, ..., UM&)>::type</tt>;
10265 if the value <tt>j</tt> of <tt>std::is_placeholder<Ti>::value</tt> is not zero the argument is <tt>std::forward<Uj>(uj)</tt> and
10266 its type <tt>Vi</tt> is <tt>Uj&&</tt>;
10269 otherwise the value is <tt>ti</tt> and its type <tt>Vi</tt> is <tt>Ti cv &</tt>.
10281 <h3><a name="819"></a>819. rethrow_if_nested</h3>
10282 <p><b>Section:</b> 18.8.6 [except.nested] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10283 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-03-25 <b>Last modified:</b> 2008-09-17</p>
10284 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#except.nested">active issues</a> in [except.nested].</p>
10285 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#except.nested">issues</a> in [except.nested].</p>
10286 <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>
10287 <p><b>Discussion:</b></p>
10289 Looking at the wording I submitted for <tt>rethrow_if_nested</tt>, I don't think I
10290 got it quite right.
10294 The current wording says:
10298 <pre>template <class E> void rethrow_if_nested(const E& e);
10302 <i>Effects:</i> Calls <tt>e.rethrow_nested()</tt> only if <tt>e</tt>
10303 is publicly derived from <tt>nested_exception</tt>.
10309 This is trying to be a bit subtle, by requiring <tt>e</tt> (not <tt>E</tt>) to be publicly
10310 derived from <tt>nested_exception</tt> the idea is that a <tt>dynamic_cast</tt> would be
10311 required to be sure. Unfortunately, if <tt>e</tt> is dynamically but not statically
10312 derived from <tt>nested_exception</tt>, <tt>e.rethrow_nested()</tt> is ill-formed.
10321 Alisdair was volunteered to provide wording.
10325 <p><b>Proposed resolution:</b></p>
10332 <h3><a name="822"></a>822. Object with explicit copy constructor no longer <tt>CopyConstructible</tt></h3>
10333 <p><b>Section:</b> X [utility.arg.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
10334 <b>Submitter:</b> James Kanze <b>Opened:</b> 2008-04-01 <b>Last modified:</b> 2009-07-26</p>
10335 <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>
10336 <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>
10337 <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>
10338 <p><b>Discussion:</b></p>
10340 I just noticed that the following program is legal in C++03, but
10341 is forbidden in the current draft:
10344 <blockquote><pre>#include <vector>
10345 #include <iostream>
10351 explicit Toto( Toto const& ) {}
10357 std::vector< Toto > v( 10 ) ;
10360 </pre></blockquote>
10363 Is this change intentional? (And if so, what is the
10364 justification? I wouldn't call such code good, but I don't see
10365 any reason to break it unless we get something else in return.)
10374 The subgroup that looked at this felt this was a good change, but it may
10375 already be handled by incoming concepts (we're not sure).
10385 Alisdair: Proposed resolution kinda funky as these tables no longer
10386 exist. Move from direct init to copy init. Clarify with Doug, recommends
10390 Walter: Suggest NAD via introduction of concepts.
10393 Recommend close as NAD.
10403 Need to look at again without concepts.
10413 Move to Ready with original proposed resolution.
10415 <p><i>[Howard: Original proposed resolution restored.]</i></p>
10421 <p><b>Proposed resolution:</b></p>
10423 In X [utility.arg.requirements] change Table 33: <tt>MoveConstructible</tt> requirements [moveconstructible]:
10429 <th>expression</th><th>post-condition</th>
10432 <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>
10435 <td colspan="2" align="center">...</td>
10441 In X [utility.arg.requirements] change Table 34: <tt>CopyConstructible</tt> requirements [copyconstructible]:
10447 <th>expression</th><th>post-condition</th>
10450 <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>
10453 <td colspan="2" align="center">...</td>
10463 <h3><a name="823"></a>823. <tt>identity<void></tt> seems broken</h3>
10464 <p><b>Section:</b> 20.3.2 [forward] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10465 <b>Submitter:</b> Walter Brown <b>Opened:</b> 2008-04-09 <b>Last modified:</b> 2009-07-30</p>
10466 <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>
10467 <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>
10468 <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>
10469 <p><b>Discussion:</b></p>
10471 N2588 seems to have added an <tt>operator()</tt> member function to the
10472 <tt>identity<></tt> helper in 20.3.2 [forward]. I believe this change makes it no
10473 longer possible to instantiate <tt>identity<void></tt>, as it would require
10474 forming a reference-to-<tt>void</tt> type as this <tt>operator()</tt>'s parameter type.
10478 Suggested resolution: Specialize <tt>identity<void></tt> so as not to require
10479 the member function's presence.
10489 Jens: suggests to add a requires clause to avoid specializing on <tt>void</tt>.
10492 Alisdair: also consider cv-qualified <tt>void</tt>.
10495 Alberto provided proposed wording.
10500 2009-07-30 Daniel reopens:
10506 This issue became closed, because the <tt>ReferentType</tt> requirement
10507 fixed the problem - this is no longer the case. In retrospective it seems
10508 to be that the root of current issues around <tt>std::identity</tt> (823, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#700">700</a>,
10509 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#939">939</a>)
10510 is that it was standardized as something very different (an unconditional
10511 type mapper) than traditional usage indicated (a function object that should
10512 derive from <tt>std::unary_function)</tt>, as the SGI definition does. This issue could
10513 be solved, if <tt>std::identity</tt> is removed (one proposal of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#939">939</a>), but until this
10514 has been decided, this issue should remain open. An alternative for
10515 removing it, would be, to do the following:
10521 Let <tt>identity</tt> stay as a <em>real</em> function object, which would
10523 derive from <tt>unary_function</tt>:
10526 <blockquote><pre>template <class T> struct identity : unary_function<T, T> {
10527 const T& operator()(const T&) const;
10529 </pre></blockquote>
10534 Invent (if needed) a generic type wrapper (corresponding to concept
10535 <tt>IdentityOf</tt>),
10536 e.g. <tt>identity_of</tt>, and move it's prototype description back to 20.3.2 [forward]:
10539 <blockquote><pre>template <class T> struct identity_of {
10542 </pre></blockquote>
10545 and adapt the <tt>std::forward</tt> signature to use <tt>identity_of</tt>
10546 instead of <tt>identity</tt>.
10553 <p><b>Proposed resolution:</b></p>
10555 Change definition of <tt>identity</tt> in 20.3.2 [forward], paragraph 2, to:
10558 <blockquote><pre>template <class T> struct identity {
10561 <ins>requires ReferentType<T></ins>
10562 const T& operator()(const T& x) const;
10564 </pre></blockquote>
10566 <blockquote><pre> <ins>requires ReferentType<T></ins>
10567 const T& operator()(const T& x) const;
10568 </pre></blockquote>
10571 <p><b>Rationale:</b></p>
10573 The point here is to able to write <tt>T&</tt> given <tt>T</tt> and <tt>ReferentType</tt> is
10574 precisely the concept that guarantees so, according to N2677
10575 (Foundational concepts). Because of this, it seems preferable than an
10576 explicit check for <tt>cv void</tt> using <tt>SameType/remove_cv</tt> as it was suggested
10577 in Sophia. In particular, Daniel remarked that there may be types other
10578 than <tt>cv void</tt> which aren't referent types (<tt>int[]</tt>, perhaps?).
10586 <h3><a name="827"></a>827. <tt>constexpr shared_ptr::shared_ptr()?</tt></h3>
10587 <p><b>Section:</b> 20.8.10.2.1 [util.smartptr.shared.const] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
10588 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2008-04-11 <b>Last modified:</b> 2009-07-21</p>
10589 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#util.smartptr.shared.const">active issues</a> in [util.smartptr.shared.const].</p>
10590 <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>
10591 <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>
10592 <p><b>Discussion:</b></p>
10594 Would anyone object to making the default constructor of <tt>shared_ptr</tt> (and
10595 <tt>weak_ptr</tt> and <tt>enable_shared_from_this) constexpr</tt>? This would enable
10596 static initialization for <tt>shared_ptr</tt> variables, eliminating another
10597 unfair advantage of raw pointers.
10607 It's not clear to us that you can initialize a pointer with the literal
10608 0 in a constant expression. We need to ask CWG to make sure this works.
10609 Bjarne has been appointed to do this.
10612 Core got back to us and assured as that <tt>nullptr</tt> would do the job
10618 2009-05-01 Alisdair adds:
10624 I don't believe that constexpr will buy anything in this case.
10625 <tt>shared_ptr/weak_ptr/enable_shared_from_this</tt> cannot be literal types as they
10626 have a non-trivial copy constructor. As they do not produce literal types,
10627 then the constexpr default constructor will <em>not</em> guarantee constant
10628 initialization, and so not buy the hoped for optimization.
10631 I recommend referring this back to Core to see if we can get static
10632 initialization for types with constexpr constructors, even if they are not
10633 literal types. Otherwise this should be closed as NAD.
10638 2009-05-26 Daniel adds:
10643 If Alisdair's 2009-05-01 comment is correct, wouldn't that also make
10644 <tt>constexpr mutex()</tt> useless, because this class has a non-trivial
10645 destructor? (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#828">828</a>)
10649 2009-07-21 Alisdair adds:
10655 The feedback from core is that this and similar uses of constexpr
10656 constructors to force static initialization should be supported. If
10657 there are any problems with this in the working draught, we should file
10662 Recommend we declare the default constructor constexpr as the issue suggests
10663 (proposed wording added).
10669 <p><b>Proposed resolution:</b></p>
10671 Change 20.8.10.2 [util.smartptr.shared] and 20.8.10.2.1 [util.smartptr.shared.const]:
10674 <blockquote><pre><ins>consexpr</ins> shared_ptr();
10675 </pre></blockquote>
10678 Change 20.8.10.3 [util.smartptr.weak] and 20.8.10.3.1 [util.smartptr.weak.const]:
10681 <blockquote><pre><ins>consexpr</ins> weak_ptr();
10682 </pre></blockquote>
10685 Change 20.8.10.5 [util.smartptr.enab] (2 places):
10688 <blockquote><pre><ins>consexpr</ins> enable_shared_from_this();
10689 </pre></blockquote>
10697 <h3><a name="828"></a>828. Static initialization for <tt>std::mutex</tt>?</h3>
10698 <p><b>Section:</b> 30.4.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>
10699 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2008-04-18 <b>Last modified:</b> 2009-05-30</p>
10700 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.mutex.class">active issues</a> in [thread.mutex.class].</p>
10701 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.mutex.class">issues</a> in [thread.mutex.class].</p>
10702 <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>
10703 <p><b>Discussion:</b></p>
10705 [Note: I'm assuming here that 3.6.2 [basic.start.init]/1 will be fixed.]
10708 Currently <tt>std::mutex</tt> doesn't support static initialization. This is a
10709 regression with respect to <tt>pthread_mutex_t</tt>, which does. I believe that
10710 we should strive to eliminate such regressions in expressive power where
10711 possible, both to ease migration and to not provide incentives to (or
10712 force) people to forego the C++ primitives in favor of pthreads.
10722 We believe this is implementable on POSIX, because the initializer-list
10723 feature and the constexpr feature make this work. Double-check core
10724 language about static initialization for this case. Ask core for a core
10725 issue about order of destruction of statically-initialized objects wrt.
10726 dynamically-initialized objects (should come afterwards). Check
10727 non-POSIX systems for implementability.
10730 If ubiquitous implementability cannot be assured, plan B is to introduce
10731 another constructor, make this constexpr, which is
10732 conditionally-supported. To avoid ambiguities, this new constructor needs
10733 to have an additional parameter.
10744 Jens: constant initialization seems to be ok core-language wise
10747 Consensus: Defer to threading experts, in particular a Microsoft platform expert.
10750 Lawrence to send e-mail to Herb Sutter, Jonathan Caves, Anthony Wiliams,
10751 Paul McKenney, Martin Tasker, Hans Boehm, Bill Plauger, Pete Becker,
10752 Peter Dimov to alert them of this issue.
10755 Lawrence: What about header file shared with C? The initialization
10756 syntax is different in C and C++.
10759 Recommend Keep in Review
10768 Keep in Review status pending feedback from members of the Concurrency subgroup.
10772 See related comments from Alisdiar and Daniel in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#827">827</a>.
10778 <p><b>Proposed resolution:</b></p>
10780 Change 30.4.1.1 [thread.mutex.class]:
10783 <blockquote><pre>class mutex {
10785 <ins>constexpr</ins> mutex();
10787 </pre></blockquote>
10794 <h3><a name="834"></a>834. Unique_ptr::pointer requirements underspecified</h3>
10795 <p><b>Section:</b> 20.8.9.2 [unique.ptr.single] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
10796 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-05-14 <b>Last modified:</b> 2009-07-16</p>
10797 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unique.ptr.single">active issues</a> in [unique.ptr.single].</p>
10798 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unique.ptr.single">issues</a> in [unique.ptr.single].</p>
10799 <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>
10800 <p><b>Discussion:</b></p>
10802 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-defects.html#821">821</a>) proposes a useful
10803 extension point for <tt>unique_ptr</tt> by granting support for an optional
10804 <tt>deleter_type::pointer</tt> to act as pointer-like replacement for <tt>element_type*</tt>
10805 (In the following: <tt>pointer</tt>).
10808 Unfortunately no requirements are specified for the type <tt>pointer</tt> which has
10809 impact on at least two key features of <tt>unique_ptr</tt>:
10813 <li>Operational fail-safety.</li>
10814 <li>(Well-)Definedness of expressions.</li>
10818 <tt>Unique_ptr</tt> specification makes great efforts to require that essentially *all*
10819 operations cannot throw and therefore adds proper wording to the affected
10820 operations of the deleter as well. If user-provided <tt>pointer</tt>-emulating types
10821 ("smart pointers") will be allowed, either *all* throw-nothing clauses have to
10822 be replaced by weaker "An exception is thrown only if <tt>pointer</tt>'s {op} throws
10823 an exception"-clauses or it has to be said explicitly that all used
10825 <tt>pointer</tt> are required *not* to throw. I understand the main focus of <tt>unique_ptr</tt>
10826 to be as near as possible to the advantages of native pointers which cannot
10827 fail and thus strongly favor the second choice. Also, the alternative position
10828 would make it much harder to write safe and simple template code for
10829 <tt>unique_ptr</tt>. Additionally, I assume that a general statement need to be given
10830 that all of the expressions of <tt>pointer</tt> used to define semantics are required to
10831 be well-formed and well-defined (also as back-end for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#762">762</a>).
10841 Howard: We maybe need a core concept <tt>PointerLike</tt>, but we don't need the
10842 arithmetic (see <tt>shared_ptr</tt> vs. <tt>vector<T>::iterator</tt>.
10845 Howard will go through and enumerate the individual requirements wrt. <tt>pointer</tt> for each member function.
10860 <p><b>Proposed resolution:</b></p>
10862 Add the following sentence just at the end of the newly proposed
10863 20.8.9.2 [unique.ptr.single]/p. 3:
10867 <tt>unique_ptr<T, D>::pointer</tt>'s operations shall be well-formed, shall have well
10868 defined behavior, and shall not throw exceptions.
10876 <h3><a name="835"></a>835. tying two streams together (correction to DR 581)</h3>
10877 <p><b>Section:</b> 27.5.4.2 [basic.ios.members] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
10878 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2008-05-17 <b>Last modified:</b> 2009-07-27</p>
10879 <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>
10880 <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>
10881 <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>
10882 <p><b>Discussion:</b></p>
10886 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#581">581</a>,
10887 now integrated into the working paper, overlooks a couple of minor
10893 First, being an unformatted function once again, <code>flush()</code>
10894 is required to create a sentry object whose constructor must, among
10895 other things, flush the tied stream. When two streams are tied
10896 together, either directly or through another intermediate stream
10897 object, flushing one will also cause a call to <code>flush()</code> on
10898 the other tied stream(s) and vice versa, ad infinitum. The program
10899 below demonstrates the problem.
10904 Second, as Bo Persson notes in his
10905 comp.lang.c++.moderated <a href="http://groups.google.com/group/comp.lang.c++.moderated/tree/browse_frm/thread/f2187794e9cc036d/305df31dc583054a">post</a>,
10906 for streams with the <code>unitbuf</code> flag set such
10907 as <code>std::stderr</code>, the destructor of the sentry object will
10908 again call <code>flush()</code>. This seems to create an infinite
10909 recursion for <code>std::cerr << std::flush;</code>
10913 <pre>#include <iostream>
10917 std::cout.tie (&std::cerr);
10918 std::cerr.tie (&std::cout);
10919 std::cout << "cout\n";
10920 std::cerr << "cerr\n";
10930 We agree with the proposed resolution.
10935 2009-05-26 Daniel adds:
10941 I think that the most recently suggested change in
10942 27.7.2.4 [ostream::sentry] need some further word-smithing. As
10943 written, it would make the behavior undefined, if under
10944 conditions when <tt>pubsync()</tt> should be called, but when
10945 in this scenario <tt>os.rdbuf()</tt> returns 0.
10948 This case is explicitly handled in <tt>flush()</tt> and needs to be
10949 taken care of. My suggested fix is:
10953 If <tt>((os.flags() & ios_base::unitbuf) && !uncaught_exception()</tt>
10954 <ins><tt>&& os.rdbuf() != 0</tt></ins>) is true, calls <del><tt>os.flush()</tt></del>
10955 <ins><tt>os.rdbuf()->pubsync()</tt></ins>.
10959 Two secondary questions are:
10964 Should <tt>pubsync()</tt> be invoked in any case or shouldn't a
10965 base requirement for this trial be that <tt>os.good() == true</tt>
10966 as required in the original <tt>flush()</tt> case?
10969 Since <tt>uncaught_exception()</tt> is explicitly tested, shouldn't
10970 a return value of -1 of <tt>pubsync()</tt> produce <tt>setstate(badbit)</tt>
10971 (which may throw <tt>ios_base::failure</tt>)?
10983 Daniel volunteered to modify the proposed resolution to address his two questions.
10991 2009-07-26 Daniel provided wording. Moved to Review.
10997 <p><b>Proposed resolution:</b></p>
11000 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf">N2914</a>
11008 Just before 27.5.4.2 [basic.ios.members]/2 insert a new paragraph:
11012 <ins><i>Requires:</i> If <tt>(tiestr != 0)</tt> is <tt>true</tt>, <tt>tiestr</tt> must not be reachable
11013 by traversing the linked list of tied stream objects starting from
11014 <tt>tiestr->tie()</tt>.</ins>
11020 Change 27.7.2.4 [ostream::sentry]/4 as indicated:
11024 If <tt>((os.flags() & ios_base::unitbuf) && !uncaught_exception()<ins>&&
11025 os.good()</ins>)</tt> is <tt>true</tt>, calls <del><tt>os.flush()</tt></del>
11026 <ins><tt>os.rdbuf()->pubsync()</tt>. If that function returns -1 sets
11027 <tt>badbit</tt> in <tt>os.rdstate()</tt> without propagating an exception</ins>.
11039 <h3><a name="836"></a>836.
11040 effects of <code>money_base::space</code> and
11041 <code>money_base::none</code> on <code>money_get</code>
11043 <p><b>Section:</b> 22.4.6.1.2 [locale.money.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
11044 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2008-05-17 <b>Last modified:</b> 2009-07-16</p>
11045 <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>
11046 <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>
11047 <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>
11048 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#670">670</a></p>
11049 <p><b>Discussion:</b></p>
11053 In paragraph 2, 22.4.6.1.2 [locale.money.get.virtuals] specifies the following:
11058 Where <code>space</code> or <code>none</code> appears in the format
11059 pattern, except at the end, optional white space (as recognized
11060 by <code>ct.is</code>) is consumed after any required space.
11065 This requirement can be (and has been) interpreted two mutually
11066 exclusive ways by different readers. One possible interpretation
11074 where <code>money_base::space</code> appears in the format, at least
11075 one space is required, and
11080 where <code>money_base::none</code> appears in the format, space is
11081 allowed but not required.
11093 where either <code>money_base::space</code> or <code>money_base::none</code> appears in the format, white space is optional.
11103 Martin will revise the proposed resolution.
11113 There is a noun missing from the proposed resolution. It's not clear
11114 that the last sentence would be helpful, even if the word were not
11118 In either case, any required MISSINGWORD followed by all optional whitespace (as recognized by ct.is()) is consumed.
11121 Strike this sentence and move to Review.
11127 <p><b>Proposed resolution:</b></p>
11130 I propose to change the text to make it clear that the first
11131 interpretation is intended, that is, to make following change to
11132 22.4.6.1.2 [locale.money.get.virtuals], p2:
11138 When <code><ins>money_base::</ins>space</code>
11139 or <code><ins>money_base::</ins>none</code> appears <ins>as the last
11140 element </ins>in the format pattern, <del>except at the end, optional
11141 white space (as recognized by <code>ct.is</code>) is consumed after
11142 any required space.</del> <ins>no white space is consumed. Otherwise,
11143 where <code>money_base::space</code> appears in any of the initial
11144 elements of the format pattern, at least one white space character is
11145 required. Where <code>money_base::none</code> appears in any of the
11146 initial elements of the format pattern, white space is allowed but not
11148 If <code>(str.flags() & str.showbase)</code> is <code>false</code>, ...
11156 <h3><a name="838"></a>838.
11157 can an <i>end-of-stream</i> iterator become a <i>non-end-of-stream</i> one?
11159 <p><b>Section:</b> 24.6.1 [istream.iterator] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
11160 <b>Submitter:</b> Martin Sebor <b>Opened:</b> 2008-05-17 <b>Last modified:</b> 2009-07-16</p>
11161 <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>
11162 <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>
11163 <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>
11164 <p><b>Discussion:</b></p>
11167 From message c++std-lib-20003...
11172 The description of <code>istream_iterator</code> in
11173 24.6.1 [istream.iterator], p1 specifies that objects of the
11174 class become the <i>end-of-stream</i> (EOS) iterators under the
11175 following condition (see also issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#788">788</a> another problem
11176 with this paragraph):
11181 If the end of stream is reached (<code>operator void*()</code> on the
11182 stream returns <code>false</code>), the iterator becomes equal to
11183 the <i>end-of-stream</i> iterator value.
11188 One possible implementation approach that has been used in practice is
11189 for the iterator to set its <code>in_stream</code> pointer to 0 when
11190 it reaches the end of the stream, just like the default ctor does on
11191 initialization. The problem with this approach is that
11192 the <i>Effects</i> clause for <code>operator++()</code> says the
11193 iterator unconditionally extracts the next value from the stream by
11194 evaluating <code>*in_stream >> value</code>, without checking
11195 for <code>(in_stream == 0)</code>.
11200 Conformance to the requirement outlined in the <i>Effects</i> clause
11201 can easily be verified in programs by setting <code>eofbit</code>
11202 or <code>failbit</code> in <code>exceptions()</code> of the associated
11203 stream and attempting to iterate past the end of the stream: each
11204 past-the-end access should trigger an exception. This suggests that
11205 some other, more elaborate technique might be intended.
11210 Another approach, one that allows <code>operator++()</code> to attempt
11211 to extract the value even for EOS iterators (just as long
11212 as <code>in_stream</code> is non-0) is for the iterator to maintain a
11213 flag indicating whether it has reached the end of the stream. This
11214 technique would satisfy the presumed requirement implied by
11215 the <i>Effects</i> clause mentioned above, but it isn't supported by
11216 the exposition-only members of the class (no such flag is shown). This
11217 approach is also found in existing practice.
11222 The inconsistency between existing implementations raises the question
11223 of whether the intent of the specification is that a non-EOS iterator
11224 that has reached the EOS become a non-EOS one again after the
11225 stream's <code>eofbit</code> flag has been cleared? That is, are the
11226 assertions in the program below expected to pass?
11230 <pre> sstream strm ("1 ");
11231 istream_iterator eos;
11232 istream_iterator it (strm);
11235 assert (it == eos);
11237 strm << "2 3 ";
11238 assert (it != eos);
11245 Or is it intended that once an iterator becomes EOS it stays EOS until
11246 the end of its lifetime?
11257 We like the direction of the proposed resolution. We're not sure about
11258 the wording, and we need more time to reflect on it,
11261 Move to Open. Detlef to rewrite the proposed resolution in such a way
11262 that no reference is made to exposition only members of
11263 <tt>istream_iterator</tt>.
11278 <p><b>Proposed resolution:</b></p>
11281 The discussion of this issue on the reflector suggests that the intent
11282 of the standard is for an <code>istreambuf_iterator</code> that has
11283 reached the EOS to remain in the EOS state until the end of its
11284 lifetime. Implementations that permit EOS iterators to return to a
11285 non-EOS state may only do so as an extension, and only as a result of
11286 calling <code>istream_iterator</code> member functions on EOS
11287 iterators whose behavior is in this case undefined.
11292 To this end we propose to change 24.6.1 [istream.iterator], p1,
11298 The result of operator-> on an end<ins>-</ins>of<ins>-</ins>stream
11299 is not defined. For any other iterator value a <code>const T*</code>
11300 is returned.<ins> Invoking <code>operator++()</code> on
11301 an <i>end-of-stream</i> iterator is undefined.</ins> It is impossible
11302 to store things into istream iterators...
11307 Add pre/postconditions to the member function descriptions of <code>istream_iterator</code> like so:
11312 <pre>istream_iterator();</pre>
11314 <i>Effects</i>: Constructs the <i>end-of-stream</i> iterator.<br>
11315 <ins><i>Postcondition</i>: <code>in_stream == 0</code>.</ins>
11317 <pre>istream_iterator(istream_type &s);</pre>
11319 <i>Effects</i>: Initializes <code>in_stream</code> with &s. value
11320 may be initialized during construction or the first time it is
11322 <ins><i>Postcondition</i>: <code>in_stream == &s</code>.</ins>
11324 <pre>istream_iterator(const istream_iterator &x);</pre>
11326 <i>Effects</i>: Constructs a copy of <code>x</code>.<br>
11327 <ins><i>Postcondition</i>: <code>in_stream == x.in_stream</code>.</ins>
11329 <pre>istream_iterator& operator++();</pre>
11331 <ins><i>Requires</i>: <code>in_stream != 0</code>.</ins><br>
11332 <i>Effects</i>: <code>*in_stream >> value</code>.
11334 <pre>istream_iterator& operator++(int);</pre>
11336 <ins><i>Requires</i>: <code>in_stream != 0</code>.</ins><br>
11338 <blockquote><pre>istream_iterator tmp (*this);
11339 *in_stream >> value;
11349 <h3><a name="847"></a>847. string exception safety guarantees</h3>
11350 <p><b>Section:</b> 21.4.1 [string.require] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
11351 <b>Submitter:</b> Hervé Brönnimann <b>Opened:</b> 2008-06-05 <b>Last modified:</b> 2009-07-16</p>
11352 <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>
11353 <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>
11354 <p><b>Discussion:</b></p>
11356 In March, on comp.lang.c++.moderated, I asked what were the
11357 string exception safety guarantees are, because I cannot see
11358 *any* in the working paper, and any implementation I know offers
11359 the strong exception safety guarantee (string unchanged if a
11360 member throws exception). The closest the current draft comes to
11361 offering any guarantees is 21.4 [basic.string], para 3:
11365 The class template <tt>basic_string</tt> conforms to the requirements
11366 for a Sequence Container (23.1.1), for a Reversible Container (23.1),
11367 and for an Allocator-aware container (91). The iterators supported by
11368 <tt>basic_string</tt> are random access iterators (24.1.5).
11372 However, the chapter 23 only says, on the topic of exceptions: 23.2 [container.requirements],
11378 Unless otherwise specified (see 23.2.2.3 and 23.2.6.4) all container types defined in this clause meet the following
11379 additional requirements:
11383 <li>if an exception is thrown by...</li>
11388 I take it as saying that this paragraph has *no* implication on
11389 <tt>std::basic_string</tt>, as <tt>basic_string</tt> isn't defined in Clause 23 and
11390 this paragraph does not define a *requirement* of Sequence
11391 nor Reversible Container, just of the models defined in Clause 23.
11392 In addition, LWG Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#718">718</a> proposes to remove 23.2 [container.requirements], para 3.
11396 Finally, the fact that no operation on Traits should throw
11397 exceptions has no bearing, except to suggest (since the only
11398 other throws should be allocation, <tt>out_of_range</tt>, or <tt>length_error</tt>)
11399 that the strong exception guarantee can be achieved.
11403 The reaction in that group by Niels Dekker, Martin Sebor, and
11404 Bo Persson, was all that this would be worth an LWG issue.
11408 A related issue is that <tt>erase()</tt> does not throw. This should be
11409 stated somewhere (and again, I don't think that the 23.2 [container.requirements], para 1
11419 Implementors will study this to confirm that it is actually possible.
11423 Daniel adds 2009-02-14:
11428 The proposed resolution of paper
11429 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2815.html">N2815</a>
11430 interacts with this issue (the paper does not refer to this issue).
11444 <p><b>Proposed resolution:</b></p>
11446 Add a blanket statement in 21.4.1 [string.require]:
11451 - if any member function or operator of <tt>basic_string<charT, traits, Allocator></tt>
11452 throws, that function or operator has no effect.
11455 - no <tt>erase()</tt> or <tt>pop_back()</tt> function throws.
11460 As far as I can tell, this is achieved by any implementation. If I made a
11461 mistake and it is not possible to offer this guarantee, then
11462 either state all the functions for which this is possible
11463 (certainly at least <tt>operator+=</tt>, <tt>append</tt>, <tt>assign</tt>, and <tt>insert</tt>),
11464 or add paragraphs to Effects clauses wherever appropriate.
11472 <h3><a name="851"></a>851. simplified array construction</h3>
11473 <p><b>Section:</b> 23.3.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
11474 <b>Submitter:</b> Benjamin Kosnik <b>Opened:</b> 2008-06-05 <b>Last modified:</b> 2009-07-25</p>
11475 <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>
11476 <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>
11477 <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>
11478 <p><b>Discussion:</b></p>
11480 This is an issue that came up on the libstdc++ list, where a
11481 discrepancy between "C" arrays and C++0x's <tt>std::array</tt> was pointed
11486 In "C," this array usage is possible:
11489 <blockquote><pre>int ar[] = {1, 4, 6};
11490 </pre></blockquote>
11496 <blockquote><pre>std::array<int> a = { 1, 4, 6 }; // error
11497 </pre></blockquote>
11500 Instead, the second parameter of the <tt>array</tt> template must be
11504 <blockquote><pre>std::array<int, 3> a = { 1, 4, 6 };
11505 </pre></blockquote>
11508 Doug Gregor proposes the following solution, that assumes
11509 generalized initializer lists.
11512 <blockquote><pre>template<typename T, typename... Args>
11513 inline array<T, sizeof...(Args)>
11514 make_array(Args&&... args)
11515 { return { std::forward<Args>(args)... }; }
11516 </pre></blockquote>
11519 Then, the way to build an <tt>array</tt> from a list of unknown size is:
11522 <blockquote><pre>auto a = make_array<T>(1, 4, 6);
11523 </pre></blockquote>
11532 Benjamin: Move to Ready?
11535 Bjarne: I'm not convinced this is useful enough to add, so I'd like us
11536 to have time to reflect on it.
11539 Alisdair: the constraints are wrong, they should be
11541 <blockquote><pre>template<ValueType T, ValueType... Args>
11542 requires Convertible<Args, T>...
11543 array<T, sizeof...(Args)> make_array(Args&&... args);
11544 </pre></blockquote>
11546 Alidair: this would be useful if we had a constexpr version.
11549 Bjarne: this is probably useful for arrays with a small number of
11550 elements, but it's not clearly useful otherwise.
11553 Consensus is to move to Open.
11558 2009-06-07 Daniel adds:
11564 I suggest a fix and a simplification of the current proposal: Recent
11566 Howard showed, that a fix is required because narrowing conversion
11567 8.5.4 [dcl.init.list]/6 b.3
11568 would severely limit the possible distribution of argument types, e.g.
11570 <tt>make_array<double>(1, 2.0)</tt> is ill-formed, because the narrowing
11571 happens <em>inside</em> the
11572 function body where no constant expressions exist anymore. Furthermore
11575 <blockquote><pre>int f();
11577 </pre></blockquote>
11579 we probably want to support
11581 <blockquote><pre>make_array<double>(f(), g());
11582 </pre></blockquote>
11585 as well. To make this feasible, the currently suggested expansion
11588 <blockquote><pre>{ std::forward<Args>(args)... }
11589 </pre></blockquote>
11592 needs to be replaced by
11595 <blockquote><pre>{ static_cast<T>(std::forward<Args>(args))... }
11596 </pre></blockquote>
11599 which is safe, because we already ensure convertibility via the
11600 element-wise <tt>Convertible<Args, T></tt> requirement. Some other fixes are
11601 necessary: The <tt>ValueType</tt> requirement for the function <em>parameters</em>
11602 is invalid, because all lvalue arguments will deduce to an lvalue-reference,
11603 thereby no longer satisfying this requirement.
11607 The suggested simplification is to provide a default-computed effective
11608 type for the result array based on common_type and decay, in
11609 unconstrained form:
11612 <blockquote><pre>template<typename... Args>
11613 array<typename decay<typename common_type<Args...>::type>::type,
11614 sizeof...(Args)>
11615 make_array(Args&&... args);
11616 </pre></blockquote>
11619 The approach used below is similar to that of <tt>make_pair</tt> and <tt>make_tuple</tt>
11620 using a symbol <tt>C</tt> to represent the decayed common type [Note: Special
11621 handling of <tt>reference_wrapper</tt> types is intentionally <em>not</em> provided, because
11622 our target has so satisfy <tt>ValueType</tt>, thus under the revised proposal only
11623 an all-<tt>reference_wrapper</tt>-arguments would be well-formed and an array of
11624 <tt>reference_wrapper</tt> will be constructed]. I do currently not suggest to
11625 add new concepts reflecting <tt>decay</tt> and <tt>common_type</tt>, but an implementor will
11626 need something like this to succeed. Note that we use a similar fuzziness for
11627 <tt>make_pair</tt> and <tt>make_tuple</tt> currently. This fuzziness is not related to
11629 missing <tt>Constructible<Vi, Ti&&></tt> requirement for those functions. The following
11630 proposal fixes that miss for <tt>make_array</tt>. If the corresponding <tt>C</tt> type
11632 explicitly wanted for standardization, here the implementation
11635 <blockquote><pre>auto concept DC<typename... T> {
11636 typename type = typename decay<typename common_type<T...>::type>::type;
11638 </pre></blockquote>
11641 where <tt>C</tt> is identical to <tt>DC<Args...>::type</tt> in the proposed resolution below.
11644 I intentionally added no further type relation between type and the concept
11645 template parameters, but instead added this requirement below to make
11646 the specification as transparent as possible. As written this concept is
11647 satisfied, if the corresponding associated type exists.
11650 <p><b>Suggested Resolution:</b></p>
11655 Add to the array synopsis in 23.3 [sequences]:
11657 <blockquote><pre><ins>
11658 template<ReferentType... Args>
11659 requires ValueType<C> && IdentityOf<Args> && Constructible<C, Args&&>...
11660 array<C, sizeof...(Args)>
11661 make_array(Args&&... args);
11663 </pre></blockquote>
11668 Append after 23.3.1.7 [array.tuple] Tuple interface to class template array
11669 the following new section:
11673 23.4.1.7 Array creation functions [array.creation]
11677 template<ReferentType... Args>
11678 requires ValueType<C> && IdentityOf<Args> && Constructible<C, Args&&>...
11679 array<C, sizeof...(Args)>
11680 make_array(Args&&... args);</ins>
11685 Let <tt>C</tt> be <tt>decay<common_type<Args...>::type>::type</tt>.
11688 <ins><i>Returns:</i> an <tt>array<C, sizeof...(Args)></tt> initialized with
11689 <tt>{ static_cast<C>(std::forward<Args>(args))... }</tt>.
11707 The proposed resolution uses concepts.
11710 Daniel to rewrite the proposed resolution.
11718 2009-07-25 Daniel provides rewritten proposed resolution.
11724 <p><b>Proposed resolution:</b></p>
11729 Add to the array synopsis in 23.3 [sequences]:
11732 <blockquote><pre><ins>template<class... Args>
11733 array<<i>CT</i>, sizeof...(Args)>
11734 make_array(Args&&... args);</ins>
11735 </pre></blockquote>
11740 Append after 23.3.1.7 [array.tuple] "Tuple interface to class template array" the
11741 following new section:
11746 <ins>XX.X.X.X Array creation functions [array.creation]</ins>
11750 template<class... Args>
11751 array<<i>CT</i>, sizeof...(Args)>
11752 make_array(Args&&... args)
11757 <ins>Let <i>CT</i> be <tt>decay<common_type<Args...>::type>::type</tt>.</ins>
11760 <ins><i>Returns:</i> An <tt>array<<i>CT</i>, sizeof...(Args)></tt> initialized with <tt>{
11761 static_cast<<i>CT</i>>(std::forward<Args>(args))... }</tt>.</ins>
11767 <blockquote><pre><ins>
11768 int i = 0; int& ri = i;
11769 make_array(42u, i, 2.78, ri);
11770 </ins></pre></blockquote>
11772 returns an array of type
11774 <blockquote><pre><ins>
11775 array<double, 4>
11776 </ins></pre></blockquote>
11779 —<i>end example</i>]</ins>
11795 <h3><a name="854"></a>854. <tt>default_delete</tt> converting constructor underspecified</h3>
11796 <p><b>Section:</b> 20.8.9.1.1 [unique.ptr.dltr.dflt] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
11797 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2008-06-18 <b>Last modified:</b> 2009-07-26</p>
11798 <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>
11799 <p><b>Discussion:</b></p>
11801 No relationship between <tt>U</tt> and <tt>T</tt> in the converting constructor for <tt>default_delete</tt> template.
11804 Requirements: <tt>U*</tt> is convertible to <tt>T*</tt> and <tt>has_virtual_destructor<T></tt>;
11805 the latter should also become a concept.
11808 Rules out cross-casting.
11811 The requirements for <tt>unique_ptr</tt> conversions should be the same as those on the deleter.
11815 Howard adds 2008-11-26:
11821 I believe we need to be careful to not outlaw the following use case, and
11822 I believe the current proposed wording
11823 (<tt>requires Convertible<U*, T*> && HasVirtualDestructor<T></tt>) does so:
11826 <blockquote><pre>#include <memory>
11830 std::unique_ptr<int> p1(new int(1));
11831 std::unique_ptr<const int> p2(move(p1));
11833 <font color="#c80000">// *p2 = i; // should not compile</font>
11835 </pre></blockquote>
11838 I've removed "<tt>&& HasVirtualDestructor<T></tt>" from the
11839 <tt>requires</tt> clause in the proposed wording.
11851 Alisdair: This issue has to stay in review pending a paper constraining
11852 <tt>unique_ptr</tt>.
11855 Consensus: We agree with the resolution, but <tt>unique_ptr</tt> needs
11856 to be constrained, too.
11859 Recommend Keep in Review.
11868 Keep in Review status for the reasons cited.
11878 The proposed resolution uses concepts. Howard needs to rewrite the
11879 proposed resolution.
11887 2009-07-26 Howard provided rewritten proposed wording and moved to Review.
11892 <p><b>Proposed resolution:</b></p>
11894 Add after 20.8.9.1.1 [unique.ptr.dltr.dflt], p1:
11897 <blockquote><pre>template <class U> default_delete(const default_delete<U>& other);
11901 -1- <i>Effects:</i> ...
11904 <i>Remarks:</i> This constructor shall participate in overload resolution
11905 if and only if <tt>U*</tt> is implicitly convertible to <tt>T*</tt>.
11916 <h3><a name="857"></a>857. <tt>condition_variable::time_wait</tt> return <tt>bool</tt> error prone</h3>
11917 <p><b>Section:</b> 30.5.1 [thread.condition.condvar] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
11918 <b>Submitter:</b> Beman Dawes <b>Opened:</b> 2008-06-13 <b>Last modified:</b> 2009-07-16</p>
11919 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.condition.condvar">active issues</a> in [thread.condition.condvar].</p>
11920 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.condition.condvar">issues</a> in [thread.condition.condvar].</p>
11921 <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>
11922 <p><b>Discussion:</b></p>
11924 The meaning of the <tt>bool</tt> returned by <tt>condition_variable::timed_wait</tt> is so
11925 obscure that even the class' designer can't deduce it correctly. Several
11926 people have independently stumbled on this issue.
11929 It might be simpler to change the return type to a scoped enum:
11931 <blockquote><pre>enum class timeout { not_reached, reached };
11932 </pre></blockquote>
11935 That's the same cost as returning a <tt>bool</tt>, but not subject to mistakes. Your example below would be:
11938 <blockquote><pre>if (cv.wait_until(lk, time_limit) == timeout::reached )
11940 </pre></blockquote>
11943 Beman to supply exact wording.
11954 There is concern that the enumeration names are just as confusing, if
11955 not more so, as the bool. You might have awoken because of a signal or a
11956 spurious wakeup, for example.
11959 Group feels that this is a defect that needs fixing.
11962 Group prefers returning an enum over a void return.
11965 Howard to provide wording.
11970 2009-06-14 Beman provided wording.
11985 <p><b>Proposed resolution:</b></p>
11987 Change Condition variables 30.5 [thread.condition], Header
11988 condition_variable synopsis, as indicated:
11991 <blockquote><pre>namespace std {
11992 class condition_variable;
11993 class condition_variable_any;
11995 <ins>enum class cv_status { no_timeout, timeout };</ins>
11997 </pre></blockquote>
12000 Change Class condition_variable 30.5.1 [thread.condition.condvar] as indicated:
12003 <blockquote><pre>class condition_variable {
12006 template <class Clock, class Duration>
12007 <del>bool</del> <ins>cv_status</ins> wait_until(unique_lock<mutex>& lock,
12008 const chrono::time_point<Clock, Duration>& abs_time);
12009 template <class Clock, class Duration, class Predicate>
12010 bool wait_until(unique_lock<mutex>& lock,
12011 const chrono::time_point<Clock, Duration>& abs_time,
12014 template <class Rep, class Period>
12015 <del>bool</del> <ins>cv_status</ins> wait_for(unique_lock<mutex>& lock,
12016 const chrono::duration<Rep, Period>& rel_time);
12017 template <class Rep, class Period, class Predicate>
12018 bool wait_for(unique_lock<mutex>& lock,
12019 const chrono::duration<Rep, Period>& rel_time,
12026 template <class Clock, class Duration>
12027 <del>bool</del> <ins>cv_status</ins> wait_until(unique_lock<mutex>& lock,
12028 const chrono::time_point<Clock, Duration>& abs_time);
12032 -15- <i>Precondition:</i> <tt>lock</tt> is locked by the calling thread, and either
12036 no other thread is waiting on this <tt>condition_variable</tt> object or
12039 <tt>lock.mutex()</tt> returns the same value for each of the <tt>lock</tt>
12040 arguments supplied by all concurrently waiting threads (via <tt>wait</tt>,
12041 <tt>wait_for</tt> or <tt>wait_until</tt>.).
12046 -16- <i>Effects:</i>
12051 Atomically calls <tt>lock.unlock()</tt> and blocks on <tt>*this</tt>.
12054 When unblocked, calls <tt>lock.lock()</tt> (possibly blocking on the lock) and returns.
12057 The function will unblock when signaled by a call to <tt>notify_one()</tt>,
12058 a call to <tt>notify_all()</tt>, <del>by
12059 the current time exceeding <tt>abs_time</tt></del> <ins>if <tt>Clock::now() >= abs_time</tt></ins>,
12063 If the function exits via an exception, <tt>lock.unlock()</tt> shall be called prior
12064 to exiting the function scope.
12069 -17- <i>Postcondition:</i> <tt>lock</tt> is locked by the calling thread.
12073 -18- <i>Returns:</i> <del><tt>Clock::now() < abs_time</tt></del>
12074 <ins><tt>cv_status::timeout</tt> if the function unblocked because <tt>abs_time</tt>
12075 was reached, otherwise <tt>cv_status::no_timeout</tt></ins>.
12079 -19- <i>Throws:</i> <tt>std::system_error</tt> when the effects or postcondition
12080 cannot be achieved.
12084 -20- <i>Error conditions:</i>
12089 <tt>operation_not_permitted</tt> — if the thread does not own the lock.
12092 equivalent error condition from <tt>lock.lock()</tt> or <tt>lock.unlock()</tt>.
12097 <pre>template <class Rep, class Period>
12098 <del>bool</del> <ins>cv_status</ins> wait_for(unique_lock<mutex>& lock,
12099 const chrono::duration<Rep, Period>& rel_time);
12104 -21- <i><del>Effects</del> <ins>Returns</ins>:</i>
12106 <blockquote><pre>wait_until(lock, chrono::monotonic_clock::now() + rel_time)
12107 </pre></blockquote>
12109 <del>-22- <i>Returns:</i> <tt>false</tt> if the call is returning because the time
12110 duration specified by <tt>rel_time</tt> has elapsed,
12111 otherwise <tt>true</tt>.</del>
12115 This part of the wording may conflict with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> in detail, but does
12116 not do so in spirit. If both issues are accepted, there is a logical merge.
12121 <pre>template <class Clock, class Duration, class Predicate>
12122 bool wait_until(unique_lock<mutex>& lock,
12123 const chrono::time_point<Clock, Duration>& abs_time,
12129 -23- <i>Effects:</i>
12131 <blockquote><pre>while (!pred())
12132 if (<del>!</del>wait_until(lock, abs_time) <ins>== cv_status::timeout</ins>)
12135 </pre></blockquote>
12138 -24- <i>Returns:</i> <tt>pred()</tt>.
12143 The returned value indicates whether the predicate evaluates to
12144 <tt>true</tt> regardless of whether the timeout was triggered.
12145 — <i>end note</i>].
12151 Change Class condition_variable_any 30.5.2 [thread.condition.condvarany] as indicated:
12154 <blockquote><pre>class condition_variable_any {
12157 template <class Lock, class Clock, class Duration>
12158 <del>bool</del> <ins>cv_status</ins> wait_until(Lock& lock,
12159 const chrono::time_point<Clock, Duration>& abs_time);
12160 template <class Lock, class Clock, class Duration, class Predicate>
12161 bool wait_until(Lock& lock,
12162 const chrono::time_point<Clock, Duration>& abs_time,
12165 template <class Lock, class Rep, class Period>
12166 <del>bool</del> <ins>cv_status</ins> wait_for(Lock& lock,
12167 const chrono::duration<Rep, Period>& rel_time);
12168 template <class Lock, class Rep, class Period, class Predicate>
12169 bool wait_for(Lock& lock,
12170 const chrono::duration<Rep, Period>& rel_time,
12177 template <class Lock, class Clock, class Duration>
12178 <del>bool</del> <ins>cv_status</ins> wait_until(Lock& lock,
12179 const chrono::time_point<Clock, Duration>& abs_time);
12185 -13- <i>Effects:</i>
12190 Atomically calls <tt>lock.unlock()</tt> and blocks on <tt>*this</tt>.
12193 When unblocked, calls <tt>lock.lock()</tt> (possibly blocking on the lock) and returns.
12196 The function will unblock when signaled by a call to <tt>notify_one()</tt>,
12197 a call to <tt>notify_all()</tt>, <del>by
12198 the current time exceeding <tt>abs_time</tt></del> <ins>if <tt>Clock::now() >= abs_time</tt></ins>,
12202 If the function exits via an exception, <tt>lock.unlock()</tt> shall be called prior
12203 to exiting the function scope.
12208 -14- <i>Postcondition:</i> <tt>lock</tt> is locked by the calling thread.
12212 -15- <i>Returns:</i> <del><tt>Clock::now() < abs_time</tt></del>
12213 <ins><tt>cv_status::timeout</tt> if the function unblocked because <tt>abs_time</tt>
12214 was reached, otherwise <tt>cv_status::no_timeout</tt></ins>.
12218 -16- <i>Throws:</i> <tt>std::system_error</tt> when the effects or postcondition
12219 cannot be achieved.
12223 -17- <i>Error conditions:</i>
12228 equivalent error condition from <tt>lock.lock()</tt> or <tt>lock.unlock()</tt>.
12233 <pre>template <class Lock, class Rep, class Period>
12234 <del>bool</del> <ins>cv_status</ins> wait_for(Lock& lock,
12235 const chrono::duration<Rep, Period>& rel_time);
12241 -18- <i><del>Effects</del> <ins>Returns</ins>:</i>
12243 <blockquote><pre>wait_until(lock, chrono::monotonic_clock::now() + rel_time)
12244 </pre></blockquote>
12247 <del>-19- <i>Returns:</i> <tt>false</tt> if the call is returning because the time
12248 duration specified by <tt>rel_time</tt> has elapsed,
12249 otherwise <tt>true</tt>.</del>
12253 This part of the wording may conflict with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> in detail, but does
12254 not do so in spirit. If both issues are accepted, there is a logical merge.
12260 <pre>template <class Lock, class Clock, class Duration, class Predicate>
12261 bool wait_until(Lock& lock,
12262 const chrono::time_point<Clock, Duration>& <del>rel_time</del> <ins>abs_time</ins>,
12268 -20- <i>Effects:</i>
12270 <blockquote><pre>while (!pred())
12271 if (<del>!</del>wait_until(lock, abs_time) <ins>== cv_status::timeout</ins>)
12274 </pre></blockquote>
12277 -21- <i>Returns:</i> <tt>pred()</tt>.
12282 The returned value indicates whether the predicate evaluates to
12283 <tt>true</tt> regardless of whether the timeout was triggered.
12284 — <i>end note</i>].
12296 <h3><a name="859"></a>859. Monotonic Clock is Conditionally Supported?</h3>
12297 <p><b>Section:</b> 30.5 [thread.condition] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
12298 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2008-06-23 <b>Last modified:</b> 2009-07-21</p>
12299 <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>
12300 <p><b>Discussion:</b></p>
12302 <p>Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#958">958</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#959">959</a>.</p>
12305 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.html">N2661</a>
12306 says that there is a class named <tt>monotonic_clock</tt>. It also says that this
12307 name may be a synonym for <tt>system_clock</tt>, and that it's conditionally
12308 supported. So the actual requirement is that it can be monotonic or not,
12309 and you can tell by looking at <tt>is_monotonic</tt>, or it might not exist at
12310 all (since it's conditionally supported). Okay, maybe too much
12311 flexibility, but so be it.
12314 A problem comes up in the threading specification, where several
12315 variants of <tt>wait_for</tt> explicitly use <tt>monotonic_clock::now()</tt>. What is the
12316 meaning of an effects clause that says
12319 <blockquote><pre>wait_until(lock, chrono::monotonic_clock::now() + rel_time)
12320 </pre></blockquote>
12323 when <tt>monotonic_clock</tt> is not required to exist?
12333 Nick: maybe instead of saying that chrono::monotonic_clock is
12334 conditionally supported, we could say that it's always there, but not
12335 necessarily supported..
12338 Beman: I'd prefer a typedef that identifies the best clock to use for
12342 Tom: combine the two concepts; create a duration clock type, but keep
12343 the is_monotonic test.
12346 Howard: if we create a duration_clock type, is it a typedef or an
12347 entirely true type?
12350 There was broad preference for a typedef.
12353 Move to Open. Howard to provide wording to add a typedef for
12354 duration_clock and to replace all uses of monotonic_clock in function
12355 calls and signatures with duration_clock.
12360 Howard notes post-San Francisco:
12366 After further thought I do not believe that creating a <tt>duration_clock typedef</tt>
12367 is the best way to proceed. An implementation may not need to use a
12368 <tt>time_point</tt> to implement the <tt>wait_for</tt> functions.
12372 For example, on POSIX systems <tt>sleep_for</tt> can be implemented in terms of
12373 <tt>nanosleep</tt> which takes only a duration in terms of nanoseconds. The current
12374 working paper does not describe <tt>sleep_for</tt> in terms of <tt>sleep_until</tt>.
12375 And paragraph 2 of 30.2.4 [thread.req.timing] has the words strongly encouraging
12376 implementations to use monotonic clocks for <tt>sleep_for</tt>:
12380 2 The member functions whose names end in <tt>_for</tt> take an argument that
12381 specifies a relative time. Implementations should use a monotonic clock to
12382 measure time for these functions.
12386 I believe the approach taken in describing the effects of <tt>sleep_for</tt>
12387 and <tt>try_lock_for</tt> is also appropriate for <tt>wait_for</tt>. I.e. these
12388 are not described in terms of their <tt>_until</tt> variants.
12400 Beman will send some suggested wording changes to Howard.
12408 2009-07-21 Beman added the requested wording changes to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#962">962</a>.
12414 <p><b>Proposed resolution:</b></p>
12416 Change 30.5.1 [thread.condition.condvar], p21-22:
12420 <pre>template <class Rep, class Period>
12421 bool wait_for(unique_lock<mutex>& lock,
12422 const chrono::duration<Rep, Period>& rel_time);
12426 <i>Precondition:</i> <tt>lock</tt> is locked by the calling thread, and either
12429 <li><ins>no other thread is waiting on this <tt>condition_variable</tt> object or</ins></li>
12430 <li><ins><tt>lock.mutex()</tt> returns the same value for each of the <tt>lock</tt>
12431 arguments supplied by all concurrently waiting threads (via <tt>wait</tt>,
12432 <tt>wait_for</tt> or <tt>wait_until</tt>).</ins></li>
12437 <blockquote><pre><del>wait_until(lock, chrono::monotonic_clock::now() + rel_time)</del>
12438 </pre></blockquote>
12441 Atomically calls <tt>lock.unlock()</tt> and blocks on <tt>*this</tt>.
12445 When unblocked, calls <tt>lock.lock()</tt> (possibly blocking on the lock) and returns.
12449 The function will unblock when signaled by a call to <tt>notify_one()</tt>, a call
12450 to <tt>notify_all()</tt>, by
12451 the elapsed time <tt>rel_time</tt> passing (30.2.4 [thread.req.timing]),
12456 If the function exits via an exception, <tt>lock.unlock()</tt> shall be called
12457 prior to exiting the function scope.
12462 <i>Postcondition:</i> <tt>lock</tt> is locked by the calling thread.
12467 22 <i>Returns:</i> <tt>false</tt> if the call is returning because the time
12468 duration specified by <tt>rel_time</tt> has elapsed, otherwise <tt>true</tt>.
12472 This part of the wording may conflict with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#857">857</a> in detail, but does
12473 not do so in spirit. If both issues are accepted, there is a logical merge.
12478 <i>Throws:</i> <tt>std::system_error</tt> when the effects or postcondition cannot be achieved.
12482 <i>Error conditions:</i>
12487 <tt>operation_not_permitted</tt> -- if the thread does not own the lock.
12490 equivalent error condition from <tt>lock.lock()</tt> or <tt>lock.unlock()</tt>.
12498 Change 30.5.1 [thread.condition.condvar], p26-p29:
12502 <pre>template <class Rep, class Period, class Predicate>
12503 bool wait_for(unique_lock<mutex>& lock,
12504 const chrono::duration<Rep, Period>& rel_time,
12509 <i>Precondition:</i> <tt>lock</tt> is locked by the calling thread, and either
12512 <li><ins>no other thread is waiting on this <tt>condition_variable</tt> object or</ins></li>
12513 <li><ins><tt>lock.mutex()</tt> returns the same value for each of the <tt>lock</tt>
12514 arguments supplied by all concurrently waiting threads (via <tt>wait</tt>,
12515 <tt>wait_for</tt> or <tt>wait_until</tt>).</ins></li>
12520 <blockquote><pre><del>wait_until(lock, chrono::monotonic_clock::now() + rel_time, std::move(pred))</del>
12524 Executes a loop: Within the loop the function first evaluates <tt>pred()</tt>
12525 and exits the loop if the result of <tt>pred()</tt> is <tt>true</tt>.
12528 Atomically calls <tt>lock.unlock()</tt>
12529 and blocks on <tt>*this</tt>.
12532 When unblocked, calls <tt>lock.lock()</tt> (possibly blocking on the lock).
12535 The function will unblock when signaled by a call to <tt>notify_one()</tt>, a
12536 call to <tt>notify_all()</tt>, by the elapsed time <tt>rel_time</tt> passing (30.1.4
12537 [thread.req.timing]), or spuriously.
12540 If the function exits via an exception, <tt>lock.unlock()</tt> shall be called
12541 prior to exiting the function scope.
12544 The loop terminates when <tt>pred()</tt> returns <tt>true</tt> or when the time
12545 duration specified by <tt>rel_time</tt> has elapsed.
12551 27 [<i>Note:</i> There is no blocking if <tt>pred()</tt> is initially <tt>true</tt>,
12552 even if the timeout has already expired. <i>-- end note</i>]
12556 <i>Postcondition:</i> <tt>lock</tt> is locked by the calling thread.
12560 28 <i>Returns:</i> <tt>pred()</tt>
12564 29 [<i>Note:</i> The returned value indicates whether the predicate evaluates to
12565 <tt>true</tt> regardless of whether the timeout was triggered. <i>-- end note</i>]
12569 <i>Throws:</i> <tt>std::system_error</tt> when the effects or postcondition cannot be achieved.
12573 <i>Error conditions:</i>
12578 <tt>operation_not_permitted</tt> -- if the thread does not own the lock.
12581 equivalent error condition from <tt>lock.lock()</tt> or <tt>lock.unlock()</tt>.
12589 Change 30.5.2 [thread.condition.condvarany], p18-19:
12593 <pre>template <class Lock, class Rep, class Period>
12594 bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time);
12600 <blockquote><pre><del>wait_until(lock, chrono::monotonic_clock::now() + rel_time)</del>
12601 </pre></blockquote>
12605 Atomically calls <tt>lock.unlock()</tt> and blocks on <tt>*this</tt>.
12609 When unblocked, calls <tt>lock.lock()</tt> (possibly blocking on the lock) and returns.
12613 The function will unblock when signaled by a call to <tt>notify_one()</tt>, a call to
12614 <tt>notify_all()</tt>, by
12615 the elapsed time <tt>rel_time</tt> passing (30.2.4 [thread.req.timing]),
12620 If the function exits via an exception, <tt>lock.unlock()</tt> shall be called
12621 prior to exiting the function scope.
12626 <i>Postcondition:</i> <tt>lock</tt> is locked by the calling thread.
12630 19 <i>Returns:</i> <tt>false</tt> if the call is returning because the time duration
12631 specified by <tt>rel_time</tt> has elapsed, otherwise <tt>true</tt>.
12635 <i>Throws:</i> <tt>std::system_error</tt> when the returned value, effects,
12636 or postcondition cannot be achieved.
12640 <i>Error conditions:</i>
12645 equivalent error condition from <tt>lock.lock()</tt> or <tt>lock.unlock()</tt>.
12652 Change 30.5.2 [thread.condition.condvarany], p23-p26:
12656 <pre>template <class Lock, class Rep, class Period, class Predicate>
12657 bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred);
12661 <i>Precondition:</i> <tt>lock</tt> is locked by the calling thread, and either
12664 <li><ins>no other thread is waiting on this <tt>condition_variable</tt> object or</ins></li>
12665 <li><ins><tt>lock.mutex()</tt> returns the same value for each of the <tt>lock</tt>
12666 arguments supplied by all concurrently waiting threads (via <tt>wait</tt>,
12667 <tt>wait_for</tt> or <tt>wait_until</tt>).</ins></li>
12672 <blockquote><pre><del>wait_until(lock, chrono::monotonic_clock::now() + rel_time, std::move(pred))</del>
12676 Executes a loop: Within the loop the function first evaluates <tt>pred()</tt>
12677 and exits the loop if the result of <tt>pred()</tt> is <tt>true</tt>.
12680 Atomically calls <tt>lock.unlock()</tt>
12681 and blocks on <tt>*this</tt>.
12684 When unblocked, calls <tt>lock.lock()</tt> (possibly blocking on the lock).
12687 The function will unblock when signaled by a call to <tt>notify_one()</tt>, a
12688 call to <tt>notify_all()</tt>, by the elapsed time <tt>rel_time</tt> passing (30.1.4
12689 [thread.req.timing]), or spuriously.
12692 If the function exits via an exception, <tt>lock.unlock()</tt> shall be called
12693 prior to exiting the function scope.
12696 The loop terminates when <tt>pred()</tt> returns <tt>true</tt> or when the time
12697 duration specified by <tt>rel_time</tt> has elapsed.
12703 24 [<i>Note:</i> There is no blocking if <tt>pred()</tt> is initially <tt>true</tt>,
12704 even if the timeout has already expired. <i>-- end note</i>]
12708 <i>Postcondition:</i> <tt>lock</tt> is locked by the calling thread.
12712 25 <i>Returns:</i> <tt>pred()</tt>
12716 26 [<i>Note:</i> The returned value indicates whether the predicate evaluates to
12717 <tt>true</tt> regardless of whether the timeout was triggered. <i>-- end note</i>]
12721 <i>Throws:</i> <tt>std::system_error</tt> when the effects or postcondition cannot be achieved.
12725 <i>Error conditions:</i>
12730 <tt>operation_not_permitted</tt> -- if the thread does not own the lock.
12733 equivalent error condition from <tt>lock.lock()</tt> or <tt>lock.unlock()</tt>.
12747 <h3><a name="860"></a>860. Floating-Point State</h3>
12748 <p><b>Section:</b> 26 [numerics] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
12749 <b>Submitter:</b> Lawrence Crowl <b>Opened:</b> 2008-06-23 <b>Last modified:</b> 2009-03-09</p>
12750 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#numerics">issues</a> in [numerics].</p>
12751 <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>
12752 <p><b>Discussion:</b></p>
12754 There are a number of functions that affect the floating point state.
12755 These function need to be thread-safe, but I'm unsure of the right
12756 approach in the standard, as we inherit them from C.
12766 Nick: I think we already say that these functions do not introduce data
12767 races; see 17.6.5.6/20
12770 Pete: there's more to it than not introducing data races; are these
12771 states maintained per thread?
12774 Howard: 21.5/14 says that strtok and strerror are not required to avoid
12775 data races, and 20.9/2 says the same about asctime, gmtime, ctime, and
12779 Nick: POSIX has a list of not-safe functions. All other functions are
12780 implicitly thread safe.
12783 Lawrence is to form a group between meetings to attack this issue. Nick
12784 and Tom volunteered to work with Lawrence.
12798 Hans: Sane oses seem ok. Sensible thing is implementable and makes sense.
12801 Nick: Default wording seems to cover this? Hole in POSIX, these
12802 functions need to be added to list of thread-unsafe functions.
12805 Lawrence: Not sufficient, not "thread-safe" per our definition, but
12806 think of state as a thread-local variable. Need something like "these
12807 functions only affect state in the current thread."
12810 Hans: Suggest the following wording: "The floating point environment is
12811 maintained per-thread."
12814 Walter: Any other examples of state being thread safe that are not
12815 already covered elsewhere?
12818 Have thread unsafe functions paper which needs to be updated. Should
12819 just fold in 26.3 [cfenv] functions.
12822 Recommend Open. Lawrence instead suggests leaving it open until we have
12823 suitable wording that may or may not include the thread local
12829 <p><b>Proposed resolution:</b></p>
12838 <h3><a name="861"></a>861. Incomplete specification of EqualityComparable for std::forward_list</h3>
12839 <p><b>Section:</b> 23.2 [container.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
12840 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-06-24 <b>Last modified:</b> 2009-07-26</p>
12841 <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>
12842 <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>
12843 <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>
12844 <p><b>Discussion:</b></p>
12846 Table 89, Container requirements, defines <tt>operator==</tt> in terms of the container
12847 member function <tt>size()</tt> and the algorithm <tt>std::equal</tt>:
12851 <tt>==</tt> is an equivalence relation. <tt>a.size() == b.size() &&
12852 equal(a.begin(), a.end(), b.begin()</tt>
12856 The new container <tt>forward_list</tt> does not provide a <tt>size</tt> member function
12857 by design but does provide <tt>operator==</tt> and <tt>operator!=</tt> without specifying it's semantic.
12860 Other parts of the (sequence) container requirements do also depend on
12861 <tt>size()</tt>, e.g. <tt>empty()</tt>
12862 or <tt>clear()</tt>, but this issue explicitly attempts to solve the missing
12863 <tt>EqualityComparable</tt> specification,
12864 because of the special design choices of <tt>forward_list</tt>.
12867 I propose to apply one of the following resolutions, which are described as:
12872 Provide a definition, which is optimal for this special container without
12873 previous size test. This choice prevents two <tt>O(N)</tt> calls of <tt>std::distance()</tt>
12874 with the corresponding container ranges and instead uses a special
12875 <tt>equals</tt> implementation which takes two container ranges instead of 1 1/2.
12878 The simple fix where the usual test is adapted such that <tt>size()</tt> is replaced
12879 by <tt>distance</tt> with corresponding performance disadvantages.
12883 Both proposal choices are discussed, the preferred choice of the author is
12894 There's an Option C: change the requirements table to use distance().
12897 LWG found Option C acceptable.
12900 Martin will draft the wording for Option C.
12905 post San Francisco:
12910 Martin provided wording for Option C.
12920 Other operational semantics (see, for example, Tables 82 and 83) are
12921 written in terms of a container's size() member. Daniel to update
12922 proposed resolution C.
12925 Howard: Commented out options A and B.
12931 2009-07-26 Daniel updated proposed resolution C.
12937 <p><b>Proposed resolution:</b></p>
12946 The changes are relative to
12947 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf">N2914</a>
12955 In 23.2.1 [container.requirements.general] change Table 80 -- Container requirements as indicated:
12961 Change the text in the Assertion/note column in the row for "<tt>X u</tt>;"
12966 post: <tt>u.<del>size() == 0</del><ins>empty() == true</ins></tt>
12972 Change the text in the Assertion/note column in the row for "<tt>X();</tt>"
12977 <tt>X().<del>size() == 0</del><ins>empty() == true</ins></tt>
12983 Change the text in the Operational Semantics column in the row for
12984 "<tt>a == b</tt>" as follows:
12987 <tt>==</tt> is an equivalence relation.
12988 <tt><del>a.size()</del><ins>distance(a.begin(), a.end())</ins> ==
12989 <del>b.size()</del><ins>distance(b.begin(), b.end())</ins> &&
12990 equal(a.begin(), a.end(), b.begin())</tt>
12996 Change the text in the Operational Semantics column in the row for
12997 "<tt>a.size()</tt>" as follows:
13001 <tt><del>a.end() - a.begin()</del><ins>distance(a.begin(), a.end())</ins></tt>
13007 Change the text in the Operational Semantics column in the row for
13008 "<tt>a.max_size()</tt>" as follows:
13012 <tt><del>size()</del><ins>distance(begin(), end())</ins></tt> of the largest
13019 Change the text in the Operational Semantics column in the row for
13020 "<tt>a.empty()</tt>" as follows:
13024 <tt><del>a.size() == 0</del><ins>a.begin() == a.end()</ins></tt>
13032 In 23.2.1 [container.requirements.general] change Table 82 -- Allocator-aware container requirements as indicated:
13038 Change the text in the Assertion/note column in the row for "<tt>X() /
13039 X u;</tt>" as follows:
13043 <i>Requires:</i> <tt>A</tt> is <tt>DefaultConstructible</tt> post: <tt><del>u.size() ==
13044 0</del><ins>u.empty() == true</ins></tt>, <tt>get_allocator() == A()</tt>
13050 Change the text in the Assertion/note column in the row for "<tt>X(m) /
13051 X u(m);</tt>" as follows:
13055 post: <tt><del>u.size() == 0</del><ins>u.empty() == true</ins>,
13056 get_allocator() == m</tt>
13064 In 23.2.3 [sequence.reqmts] change Table 83 -- Sequence container requirements as indicated:
13070 Change the text in the Assertion/note column in the row for "<tt>X(n,
13071 t) / X a(n, t)</tt>" as follows:
13075 post: <tt><del>size()</del><ins>distance(begin(), end())</ins> == n [..]</tt>
13081 Change the text in the Assertion/note column in the row for "<tt>X(i,
13082 j) / X a(i, j)</tt>" as follows:
13086 [..] post: <del><tt>size() ==</tt> distance between <tt>i</tt> and
13087 <tt>j</tt></del><ins><tt>distance(begin(), end()) == distance(i, j)</tt></ins> [..]
13093 Change the text in the Assertion/note column in the row for
13094 "<tt>a.clear()</tt>" as follows:
13097 <tt><ins>a.</ins>erase(<ins>a.</ins>begin(), <ins>a.</ins>end())</tt> post:
13098 <tt><del>size() == 0</del><ins>a.empty() == true</ins></tt>
13106 In 23.2.4 [associative.reqmts] change Table 85 -- Associative container requirements as indicated:
13110 Not every occurrence of <tt>size()</tt> was replaced, because all current
13111 associative containers
13112 have a <tt>size</tt>. The following changes ensure consistency regarding the
13113 semantics of "<tt>erase</tt>"
13114 for all tables and adds some missing objects
13121 Change the text in the Complexity column in the row for
13122 "<tt>a.insert(i, j)</tt>" as follows:
13125 <tt>N log(<ins>a.</ins>size() + N)</tt> <del>(<tt>N</tt> is the distance from <tt>i</tt> to
13126 <tt>j</tt>)</del><ins> where <tt>N == distance(i, j)</tt></ins>
13132 Change the text in the Complexity column in the row for
13133 "<tt>a.erase(k)</tt>" as follows:
13136 <tt>log(<ins>a.</ins>size()) + <ins>a.</ins>count(k)</tt>
13142 Change the text in the Complexity column in the row for
13143 "<tt>a.erase(q1, q2)</tt>" as follows:
13147 <tt>log(<ins>a.</ins>size()) + N</tt> where <tt>N</tt> <del>is the distance from <tt>q1</tt>
13148 to <tt>q2</tt></del>
13149 <ins><tt>== distance(q1, q2)</tt></ins>.
13155 Change the text in the Assertion/note column in the row for
13156 "<tt>a.clear()</tt>" as follows:
13160 <tt><ins>a.</ins>erase(a.begin(),a.end())</tt> post: <tt><del>size() ==
13161 0</del><ins>a.empty() == true</ins></tt>
13167 Change the text in the Complexity column in the row for "<tt>a.clear()</tt>"
13172 linear in <tt><ins>a.</ins>size()</tt>
13178 Change the text in the Complexity column in the row for
13179 "<tt>a.count(k)</tt>" as follows:
13183 <tt>log(<ins>a.</ins>size()) + <ins>a.</ins>count(k)</tt>
13191 In 23.2.5 [unord.req] change Table 87 -- Unordered associative container requirements as indicated:
13194 The same rational as for Table 85 applies here
13201 Change the text in the Assertion/note column in the row for
13202 "<tt>a.clear()</tt>" as follows:
13206 [..] Post: <tt>a.<del>size() == 0</del><ins>empty() == true</ins></tt>
13221 <h3><a name="865"></a>865. More algorithms that throw away information</h3>
13222 <p><b>Section:</b> 25.4.6 [alg.fill], 25.4.7 [alg.generate] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
13223 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-07-13 <b>Last modified:</b> 2009-07-25</p>
13224 <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>
13225 <p><b>Discussion:</b></p>
13227 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
13228 unnecessarily throw away information. These are typically algorithms,
13229 which sequentially write into an <tt>OutputIterator</tt>, but do not return the
13230 final value of this output iterator. These cases are:
13235 <pre>template<class OutputIterator, class Size, class T>
13236 void fill_n(OutputIterator first, Size n, const T& value);</pre></li>
13239 <pre>template<class OutputIterator, class Size, class Generator>
13240 void generate_n(OutputIterator first, Size n, Generator gen);</pre></li>
13243 In both cases the minimum requirements on the iterator are
13244 <tt>OutputIterator</tt>, which means according to the requirements of
13245 24.2.3 [output.iterators]/2 that only single-pass iterations are guaranteed.
13246 So, if users of <tt>fill_n</tt> and <tt>generate_n</tt> have *only* an <tt>OutputIterator</tt>
13247 available, they have no chance to continue pushing further values
13248 into it, which seems to be a severe limitation to me.
13252 Post Summit Daniel "conceptualized" the wording.
13262 Alisdair likes the idea, but has concerns about the specific wording
13263 about the returns clauses.
13266 Alan notes this is a feature request.
13269 Bill notes we have made similar changes to other algorithms.
13282 We have a consensus for moving forward on this issue, but Daniel needs
13283 to deconceptify it.
13287 2009-07-25 Daniel provided non-concepts wording.
13293 <p><b>Proposed resolution:</b></p>
13298 Replace the current declaration of <tt>fill_n</tt> in 25 [algorithms]/2, header
13299 <tt><algorithm></tt> synopsis and in 25.4.6 [alg.fill] by
13302 <blockquote><pre>template<class OutputIterator, class Size, class T>
13303 <del>void</del><ins>OutputIterator</ins> fill_n(OutputIterator first, Size n, const T& value);
13304 </pre></blockquote>
13307 Just after the effects clause add a new returns clause saying:
13311 <ins><i>Returns:</i> For <tt>fill_n</tt> and positive <tt>n</tt>, returns <tt>first + n</tt>. Otherwise
13312 returns <tt>first</tt> for <tt>fill_n</tt>.</ins>
13318 Replace the current declaration of <tt>generate_n</tt> in 25 [algorithms]/2,
13319 header <tt><algorithm></tt> synopsis and in 25.4.7 [alg.generate] by
13322 <blockquote><pre>template<class OutputIterator, class Size, class Generator>
13323 <del>void</del><ins>OutputIterator</ins> generate_n(OutputIterator first, Size n, Generator gen);
13324 </pre></blockquote>
13327 Just after the effects clause add a new returns clause saying:
13331 <ins>For <tt>generate_n</tt> and positive <tt>n</tt>, returns <tt>first + n</tt>. Otherwise
13332 returns <tt>first</tt> for <tt>generate_n</tt>.</ins>
13344 <h3><a name="868"></a>868. default construction and value-initialization</h3>
13345 <p><b>Section:</b> 23 [containers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
13346 <b>Submitter:</b> Alberto Ganesh Barbati <b>Opened:</b> 2008-07-22 <b>Last modified:</b> 2009-07-19</p>
13347 <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>
13348 <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>
13349 <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>
13350 <p><b>Discussion:</b></p>
13352 The term "default constructed" is often used in wording that predates
13353 the introduction of the concept of value-initialization. In a few such
13354 places the concept of value-initialization is more correct than the
13355 current wording (for example when the type involved can be a built-in)
13356 so a replacement is in order. Two of such places are already covered by
13357 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#867">867</a>. This issue deliberately addresses the hopefully
13358 non-controversial changes in the attempt of being approved more quickly.
13359 A few other occurrences (for example in <tt>std::tuple</tt>,
13360 <tt>std::reverse_iterator</tt> and <tt>std::move_iterator</tt>) are left to separate
13361 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
13362 related with issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#724">724</a>.
13372 The list provided in the proposed resolution is not complete. James
13373 Dennett will review the library and provide a complete list and will
13374 double-check the vocabulary.
13377 This issue relates to Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#886">886</a> tuple construction
13388 The proposed resolution is incomplete.
13391 Move to Tentatively NAD Future. Howard will contact Ganesh for wording.
13392 If wording is forthcoming, Howard will move it back to Review.
13397 2009-07-18 Ganesh updated the proposed wording.
13403 Howard: Moved back to Review. Note that X [utility.arg.requirements]
13404 refers to a section that is not in the current working paper, but does refer to
13405 a section that we expect to reappear after the de-concepts merge. This was a
13406 point of confusion we did not recognize when we reviewed this issue in Frankfurt.
13409 Howard: Ganesh also includes a survey of places in the WP surveyed for changes
13410 of this nature and purposefully <em>not</em> treated:
13415 Places where changes are <u>not</u> being
13419 In the following paragraphs, we are not proposing changes because
13420 it's not clear whether we actually prefer value-initialization over
13421 default-initialization (now partially covered by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1012">1012</a>):
13424 <li><p>20.8.9.2.1 [unique.ptr.single.ctor] para 3 e 7</p></li>
13425 <li><p>24.5.1.2.1 [reverse.iter.cons] para 1</p></li>
13426 <li><p>24.5.2.2.1 [move.iter.op.const] para 1</p></li>
13428 <p>In the following paragraphs, the expression "default
13429 constructed" need not be changed, because the relevant type does
13430 not depend on a template parameter and has a user-provided
13433 <li><p> [func.referenceclosure.invoke] para 12, type:
13434 reference_closure</p></li>
13435 <li><p>30.3.1.2 [thread.thread.constr] para 30, type: thread</p></li>
13436 <li><p>30.3.1.5 [thread.thread.member] para 52, type: thread_id</p></li>
13437 <li><p>30.3.2 [thread.thread.this], para 1, type: thread_id</p></li>
13445 <p><b>Proposed resolution:</b></p>
13447 Change X [utility.arg.requirements] para 2:
13451 In general, a default constructor is
13452 not required. Certain container class member function signatures
13453 specify <del>the default constructor</del><ins>T()</ins>
13454 as a default argument. T() shall be a well-defined expression (8.5)
13455 if one of those signatures is called using the default argument
13460 Change 23.3.2.1 [deque.cons] para 5:
13464 <i>Effects:</i> Constructs a deque with n
13465 <del>default constructed</del><ins>value-initialized</ins>
13470 Change 23.3.2.2 [deque.capacity] para 1:
13474 <i>Effects:</i> If sz < size(), equivalent
13475 to erase(begin() + sz, end());. If size() < sz, appends sz -
13476 size() <del>default
13477 constructed</del><ins>value-initialized</ins>
13478 elements to the sequence.
13482 Change 23.3.3.1 [forwardlist.cons] para 5:
13486 <i>Effects:</i> Constructs a forward_list object with n <del>default
13487 constructed</del><ins>value-initialized</ins>
13492 Change 23.3.3.4 [forwardlist.modifiers] para 21:
13496 <i>Effects:</i> [...] For the first signature
13497 the inserted elements are <del>default
13498 constructed</del><ins>value-initialized</ins>,
13499 and for the second signature they are copies of c.
13503 Change 23.3.4.1 [list.cons] para 5:
13507 <i>Effects:</i> Constructs a list with n <del>default
13508 constructed</del><ins>value-initialized</ins>
13513 Change 23.3.4.2 [list.capacity] para 15:
13517 <i>Effects:</i> If sz < size(), equivalent
13518 to list<T>::iterator it = begin(); advance(it, sz); erase(it,
13519 end());. If size() < sz, appends sz - size() <del>default
13520 constructed</del><ins>value-initialized</ins>
13521 elements to the sequence.
13525 Change 23.3.6.1 [vector.cons] para 3:
13529 <i>Effects:</i> Constructs a vector with n
13530 <del>default constructed</del><ins>value-initialized</ins>
13535 Change 23.3.6.2 [vector.capacity] para 24:
13539 <i>Effects:</i> If sz < size(), equivalent
13540 to erase(begin() + sz, end());. If size() < sz, appends sz -
13541 size() <del>default
13542 constructed</del><ins>value-initialized</ins>
13543 elements to the sequence.
13552 <h3><a name="870"></a>870. Do unordered containers not support function pointers for predicate/hasher?</h3>
13553 <p><b>Section:</b> 23.2.5 [unord.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
13554 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-08-17 <b>Last modified:</b> 2009-07-28</p>
13555 <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>
13556 <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>
13557 <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>
13558 <p><b>Discussion:</b></p>
13560 Good ol' associative containers allow both function pointers and
13561 function objects as feasible
13562 comparators, as described in 23.2.4 [associative.reqmts]/2:
13566 Each associative container is parameterized on <tt>Key</tt> and an ordering
13567 relation <tt>Compare</tt> that
13568 induces a strict weak ordering (25.3) on elements of Key. [..]. The
13569 object of type <tt>Compare</tt> is
13570 called the comparison object of a container. This comparison object
13571 may be a pointer to
13572 function or an object of a type with an appropriate function call operator.[..]
13576 The corresponding wording for unordered containers is not so clear,
13577 but I read it to disallow
13578 function pointers for the hasher and I miss a clear statement for the
13579 equality predicate, see
13580 23.2.5 [unord.req]/3+4+5:
13585 Each unordered associative container is parameterized by <tt>Key</tt>, by a
13586 function object <tt>Hash</tt> that
13587 acts as a hash function for values of type <tt>Key</tt>, and by a binary
13588 predicate <tt>Pred</tt> that induces an
13589 equivalence relation on values of type <tt>Key</tt>.[..]
13592 A hash function is a function object that takes a single argument of
13593 type <tt>Key</tt> and returns a
13594 value of type <tt>std::size_t</tt>.
13597 Two values <tt>k1</tt> and <tt>k2</tt> of type <tt>Key</tt> are considered equal if the
13598 container's equality function object
13599 returns <tt>true</tt> when passed those values.[..]
13604 and table 97 says in the column "assertion...post-condition" for the
13605 expression X::hasher:
13609 <tt>Hash</tt> shall be a unary function object type such that the expression
13610 <tt>hf(k)</tt> has type <tt>std::size_t</tt>.
13614 Note that 20.7 [function.objects]/1 defines as "Function objects are
13615 objects with an <tt>operator()</tt> defined.[..]"
13618 Does this restriction exist by design or is it an oversight? If an
13619 oversight, I suggest that to apply
13624 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
13630 <p><b>Proposed resolution:</b></p>
13632 In 23.2.5 [unord.req]/3, just after the second sentence which is written as
13636 Additionally, <tt>unordered_map</tt> and <tt>unordered_multimap</tt> associate an
13637 arbitrary mapped type <tt>T</tt> with the <tt>Key</tt>.
13641 add one further sentence:
13645 Both <tt>Hash</tt> and <tt>Pred</tt> may be pointers to function or objects of a type
13646 with an appropriate function call operator.
13650 [Note1: Since the detailed requirements for <tt>Pred</tt> and <tt>Hash</tt> are given in
13651 p.4 and p.5, it an alternative resolution
13652 would be to insert a new paragraph just after p.5, which contains the
13653 above proposed sentence]
13656 [Note2: I do not propose a change of above quoted element in table 97,
13657 because the mis-usage of the
13658 notion of "function object" seems already present in the standard at
13659 several places, even if it includes
13660 function pointers, see e.g. 25 [algorithms]/7. The important point is
13661 that in those places a statement is
13662 given that the actually used symbol, like "Predicate" applies for
13663 function pointers as well]
13667 <p><b>Rationale:</b></p>
13675 <a href="" ref="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2776.pdf">N2776</a>.
13684 <h3><a name="871"></a>871. Iota's requirements on T are too strong</h3>
13685 <p><b>Section:</b> 26.7.5 [numeric.iota] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
13686 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-08-20 <b>Last modified:</b> 2009-07-30</p>
13687 <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>
13688 <p><b>Discussion:</b></p>
13690 According to the recent WP
13691 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2691.pdf">N2691</a>,
13692 26.7.5 [numeric.iota]/1, the requires clause
13693 of <tt>std::iota</tt> says:
13697 <tt>T</tt> shall meet the requirements of <tt>CopyConstructible</tt> and <tt>Assignable</tt> types, and
13698 shall be convertible to <tt>ForwardIterator</tt>'s value type.[..]
13702 Neither <tt>CopyConstructible</tt> nor <tt>Assignable</tt> is needed, instead <tt>MoveConstructible</tt>
13703 seems to be the correct choice. I guess the current wording resulted as an
13704 artifact from comparing it with similar numerical algorithms like <tt>accumulate</tt>.
13708 Note: If this function will be conceptualized, the here proposed
13709 <tt>MoveConstructible</tt>
13710 requirement can be removed, because this is an implied requirement of
13711 function arguments, see
13712 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2710.pdf">N2710</a>/[temp.req.impl]/3, last bullet.
13716 post San Francisco:
13721 Issue pulled by author prior to review.
13725 2009-07-30 Daniel reopened:
13730 with the absence of concepts, this issue (closed) is valid again and I
13731 suggest to reopen it.
13732 I also revised by proposed resolution based on N2723 wording:
13737 <p><b>Proposed resolution:</b></p>
13739 Change the first sentence of 26.7.5 [numeric.iota]/1:
13743 <i>Requires:</i> <tt>T</tt> shall <del>meet the requirements of <tt>CopyConstructible</tt> and
13744 <tt>Assignable</tt> types, and shall</del> be
13745 convertible to <tt>ForwardIterator</tt>'s value type. [..]
13756 <h3><a name="872"></a>872. <tt>move_iterator::operator[]</tt> has wrong return type</h3>
13757 <p><b>Section:</b> 24.5.2.2.12 [move.iter.op.index] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
13758 <b>Submitter:</b> Doug Gregor <b>Opened:</b> 2008-08-21 <b>Last modified:</b> 2009-07-28</p>
13759 <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>
13760 <p><b>Discussion:</b></p>
13762 <tt>move_iterator</tt>'s <tt>operator[]</tt> is declared as:
13765 <blockquote><pre>reference operator[](difference_type n) const;
13766 </pre></blockquote>
13769 This has the same problem that <tt>reverse_iterator</tt>'s <tt>operator[]</tt> used to
13770 have: if the underlying iterator's <tt>operator[]</tt> returns a proxy, the
13771 implicit conversion to <tt>value_type&&</tt> could end up referencing a temporary
13772 that has already been destroyed. This is essentially the same issue that
13773 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>.
13777 2009-07-28 Reopened by Alisdair. No longer solved by concepts.
13783 <p><b>Proposed resolution:</b></p>
13785 In 24.5.2.1 [move.iterator] and 24.5.2.2.12 [move.iter.op.index], change the declaration of
13786 <tt>move_iterator</tt>'s <tt>operator[]</tt> to:
13789 <blockquote><pre><del>reference</del> <ins><i>unspecified</i></ins> operator[](difference_type n) const;
13790 </pre></blockquote>
13794 <p><b>Rationale:</b></p>
13802 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2777.pdf">N2777</a>.
13809 <h3><a name="876"></a>876. <tt>basic_string</tt> access operations should give stronger guarantees</h3>
13810 <p><b>Section:</b> 21.4 [basic.string] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
13811 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-08-22 <b>Last modified:</b> 2009-07-17</p>
13812 <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>
13813 <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>
13814 <p><b>Discussion:</b></p>
13816 During the Sophia Antipolis meeting it was decided to split-off some
13818 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2647.html">n2647</a>
13819 ("Concurrency modifications for <tt>basic_string</tt>")
13820 proposal into a separate issue, because these weren't actually
13821 concurrency-related. The here proposed changes refer to the recent
13823 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2668.htm">n2668</a>
13824 and attempt to take advantage of the
13825 stricter structural requirements.
13828 Indeed there exists some leeway for more guarantees that would be
13829 very useful for programmers, especially if interaction with transactionary
13830 or exception-unaware C API code is important. This would also allow
13831 compilers to take advantage of more performance optimizations, because
13832 more functions can have throw() specifications. This proposal uses the
13833 form of "Throws: Nothing" clauses to reach the same effect, because
13834 there already exists a different issue in progress to clean-up the current
13835 existing "schizophrenia" of the standard in this regard.
13838 Due to earlier support for copy-on-write, we find the following
13839 unnecessary limitations for C++0x:
13844 Missing no-throw guarantees: <tt>data()</tt> and <tt>c_str()</tt> simply return
13845 a pointer to their guts, which is a non-failure operation. This should
13846 be spelled out. It is also noteworthy to mention that the same
13847 guarantees should also be given by the size query functions,
13848 because the combination of pointer to content and the length is
13849 typically needed during interaction with low-level API.
13852 Missing complexity guarantees: <tt>data()</tt> and <tt>c_str()</tt> simply return
13853 a pointer to their guts, which is guaranteed O(1). This should be
13857 Missing reading access to the terminating character: Only the
13858 const overload of <tt>operator[]</tt> allows reading access to the terminator
13859 char. For more intuitive usage of strings, reading access to this
13860 position should be extended to the non-const case. In contrast
13861 to C++03 this reading access should now be homogeneously
13867 The proposed resolution is split into a main part (A) and a
13868 secondary part (B) (earlier called "Adjunct Adjunct Proposal").
13869 (B) extends (A) by also making access to index position
13870 size() of the at() overloads a no-throw operation. This was
13871 separated, because this part is theoretically observable in
13872 specifically designed test programs.
13882 We oppose part 1 of the issue but hope to address <tt>size()</tt> in
13883 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#877">877</a>.
13886 We do not support part B. 4 of the issue because of the breaking API change.
13889 We support part A. 2 of the issue.
13892 On support part A. 3 of the issue:
13895 Pete's broader comment: now that we know that basic_string will be a
13896 block of contiguous memory, we should just rewrite its specification
13897 with that in mind. The expression of the specification will be simpler
13898 and probably more correct as a result.
13909 Move proposed resolution A to Ready.
13912 Howard: Commented out part B.
13919 <p><b>Proposed resolution:</b></p>
13924 <p>In 21.4.4 [string.capacity], just after p. 1 add a new paragraph:
13927 <i>Throws:</i> Nothing.
13933 In 21.4.5 [string.access] <em>replace</em> p. 1 by the following <em>4</em> paragraghs:
13938 <i>Requires:</i> <tt>pos ≤ size()</tt>.
13941 <i>Returns:</i> If <tt>pos < size()</tt>, returns <tt>*(begin() + pos)</tt>. Otherwise, returns
13942 a reference to a <tt>charT()</tt> that shall not be modified.
13945 <i>Throws:</i> Nothing.
13948 <i>Complexity:</i> Constant time.
13955 In 21.4.7.1 [string.accessors] replace the now <em>common</em> returns
13956 clause of <tt>c_str()</tt> and <tt>data()</tt> by the following <em>three</em> paragraphs:
13960 <i>Returns:</i> A pointer <tt>p</tt> such that <tt>p+i == &operator[](i)</tt> for each <tt>i</tt>
13961 in <tt>[0, size()]</tt>.
13964 <i>Throws:</i> Nothing.
13967 <i>Complexity:</i> Constant time.
13982 <h3><a name="879"></a>879. Atomic load const qualification</h3>
13983 <p><b>Section:</b> 29 [atomics] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
13984 <b>Submitter:</b> Alexander Chemeris <b>Opened:</b> 2008-08-24 <b>Last modified:</b> 2009-07-17</p>
13985 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics">active issues</a> in [atomics].</p>
13986 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics">issues</a> in [atomics].</p>
13987 <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>
13988 <p><b>Discussion:</b></p>
13990 The <tt>atomic_address</tt> type and <tt>atomic<T*></tt> specialization provide atomic
13991 updates to pointers. However, the current specification requires
13992 that the types pointer be to non-const objects. This restriction
13993 is unnecessary and unintended.
14001 Move to review. Lawrence will first check with Peter whether the
14002 current examples are sufficient, or whether they need to be expanded to
14013 Lawrence will handle all issues relating to atomics in a single paper.
14016 LWG will defer discussion on atomics until that paper appears.
14025 <p><b>Proposed resolution:</b></p>
14027 Add const qualification to the pointer values of the <tt>atomic_address</tt>
14028 and <tt>atomic<T*></tt> specializations. E.g.
14031 <blockquote><pre>typedef struct atomic_address {
14032 void store(<ins>const</ins> void*, memory_order = memory_order_seq_cst) volatile;
14033 void* exchange( <ins>const</ins> void*, memory_order = memory_order_seq_cst) volatile;
14034 bool compare_exchange( <ins>const</ins> void*&, <ins>const</ins> void*,
14035 memory_order, memory_order) volatile;
14036 bool compare_exchange( <ins>const</ins> void*&, <ins>const</ins> void*,
14037 memory_order = memory_order_seq_cst ) volatile;
14038 void* operator=(<ins>const</ins> void*) volatile;
14041 void atomic_store(volatile atomic_address*, <ins>const</ins> void*);
14042 void atomic_store_explicit(volatile atomic_address*, <ins>const</ins> void*,
14044 void* atomic_exchange(volatile atomic_address*<ins>, const void*</ins>);
14045 void* atomic_exchange_explicit(volatile atomic_address*, <ins>const</ins> void*,
14047 bool atomic_compare_exchange(volatile atomic_address*,
14048 <ins>const</ins> void**, <ins>const</ins> void*);
14049 bool atomic_compare_exchange_explicit(volatile atomic_address*,
14050 <ins>const</ins> void**, <ins>const</ins> void*,
14051 memory_order, memory_order);
14052 </pre></blockquote>
14059 <h3><a name="880"></a>880. Missing atomic exchange parameter</h3>
14060 <p><b>Section:</b> 29 [atomics] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
14061 <b>Submitter:</b> Lawrence Crowl <b>Opened:</b> 2008-08-24 <b>Last modified:</b> 2009-07-17</p>
14062 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics">active issues</a> in [atomics].</p>
14063 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics">issues</a> in [atomics].</p>
14064 <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>
14065 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#942">942</a></p>
14066 <p><b>Discussion:</b></p>
14068 The <tt>atomic_exchange</tt> and <tt>atomic_exchange_explicit</tt> functions seem to
14069 be inconsistently missing parameters.
14079 Lawrence: Need to write up a list for Pete with details.
14082 Detlef: Should not be New, we already talked about in Concurrency group.
14096 Lawrence will handle all issues relating to atomics in a single paper.
14099 LWG will defer discussion on atomics until that paper appears.
14108 <p><b>Proposed resolution:</b></p>
14110 Add the appropriate parameters. For example,
14113 <blockquote><pre>bool atomic_exchange(volatile atomic_bool*<ins>, bool</ins>);
14114 bool atomic_exchange_explicit(volatile atomic_bool*, bool<ins>, memory_order</ins>);
14115 </pre></blockquote>
14122 <h3><a name="881"></a>881. shared_ptr conversion issue</h3>
14123 <p><b>Section:</b> 20.8.10.2.1 [util.smartptr.shared.const] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
14124 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2008-08-30 <b>Last modified:</b> 2009-07-17</p>
14125 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#util.smartptr.shared.const">active issues</a> in [util.smartptr.shared.const].</p>
14126 <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>
14127 <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>
14128 <p><b>Discussion:</b></p>
14130 We've changed <tt>shared_ptr<Y></tt> to not convert to <tt>shared_ptr<T></tt> when <tt>Y*</tt>
14131 doesn't convert to <tt>T*</tt> by resolving issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#687">687</a>. This only fixed the
14132 converting copy constructor though.
14133 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2351.htm">N2351</a>
14134 later added move support, and
14135 the converting move constructor is not constrained.
14144 We might be able to move this to NAD, Editorial once shared_ptr is
14145 conceptualized, but we want to revisit this issue to make sure.
14158 This issue now represents the favored format for specifying constrained templates.
14164 <p><b>Proposed resolution:</b></p>
14166 We need to change the Requires clause of the move constructor:
14169 <blockquote><pre>shared_ptr(shared_ptr&& r);
14170 template<class Y> shared_ptr(shared_ptr<Y>&& r);
14173 <i><del>Requires</del> <ins>Remarks</ins>:</i> <del>For the second constructor <tt>Y*</tt> shall be
14174 convertible to <tt>T*</tt>.</del>
14176 The second constructor shall not participate in overload resolution
14177 unless <tt>Y*</tt> is convertible to <tt>T*</tt>.
14183 in order to actually make the example in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#687">687</a> compile
14184 (it now resolves to the move constructor).
14193 <h3><a name="883"></a>883. swap circular definition</h3>
14194 <p><b>Section:</b> 23 [containers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
14195 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-09-10 <b>Last modified:</b> 2009-07-17</p>
14196 <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>
14197 <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>
14198 <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>
14199 <p><b>Discussion:</b></p>
14202 Note in particular that Table 90 "Container Requirements" gives
14203 semantics of <tt>a.swap(b)</tt> as <tt>swap(a,b)</tt>, yet for all
14204 containers we define <tt>swap(a,b)</tt> to call <tt>a.swap(b)</tt> - a
14205 circular definition.
14214 Robert to propose a resolution along the lines of "Postcondition: "a =
14215 b, b = a" This will be a little tricky for the hash containers, since
14216 they don't have <tt>operator==</tt>.
14220 Post Summit Anthony Williams provided proposed wording.
14230 Moved to Ready with minor edits (which have been made).
14235 <p><b>Proposed resolution:</b></p>
14237 In table 80 in section 23.2.1 [container.requirements.general],
14238 replace the postcondition of <tt>a.swap(b)</tt> with the following:
14243 <caption>Table 80 -- Container requirements</caption>
14245 <th>Expression</th>
14246 <th>Return type</th>
14247 <th>Operational semantics</th>
14248 <th>Assertion/note pre-/post-conidtion</th>
14249 <th>Complexity</th>
14259 <td><tt>a.swap(b);</tt></td>
14260 <td><tt>void</tt></td>
14262 <td><del><tt>swap(a,b)</tt></del>
14263 <ins>Exchange the contents of <tt>a</tt> and <tt>b</tt>.</ins></td>
14270 Remove the reference to swap from the paragraph following the table.
14274 Notes: the algorithms <del><tt>swap()</tt>, </del><tt>equal()</tt> and
14275 <tt>lexicographical_compare()</tt> are defined in Clause 25. ...
14283 <h3><a name="885"></a>885. pair assignment</h3>
14284 <p><b>Section:</b> 20.3.3 [pairs] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
14285 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-09-15 <b>Last modified:</b> 2009-07-17</p>
14286 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#pairs">active issues</a> in [pairs].</p>
14287 <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>
14288 <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>
14289 <p><b>Discussion:</b></p>
14290 <blockquote><pre>20.2.3 pairs
14291 Missing assignemnt operator:
14292 template<class U , class V>
14293 requires CopyAssignable<T1, U> && CopyAssignable<T2, V>
14294 pair& operator=(pair<U , V> const & p );
14295 </pre></blockquote>
14298 Well, that's interesting. This assignment operator isn't in the
14299 current working paper, either. Perhaps we deemed it acceptable to
14300 build a temporary of type <tt>pair</tt> from <tt>pair<U, V></tt>, then move-assign
14301 from that temporary?
14304 It sounds more like an issue waiting to be opened, unless you want to plug
14305 it now. As written we risk moving from lvalues.
14315 Would be NAD if better ctors fixed it.
14318 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#811">811</a>.
14323 post San Francisco:
14328 Possibly NAD Editorial, solved by
14329 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2770.pdf">N2770</a>.
14333 2009-05-25 Alisdair adds:
14338 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#885">885</a> was something I reported while reviewing the library concepts
14339 documents ahead of San Francisco. The missing operator was added as part of
14340 the paper adopted at that meeting
14341 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2770.pdf">N2770</a>)
14342 and I can confirm this operator is
14343 present in the current working paper. I recommend NAD.
14352 We agree with the intent, but we need to wait for the dust to settle on concepts.
14357 <p><b>Proposed resolution:</b></p>
14366 <h3><a name="886"></a>886. tuple construction</h3>
14367 <p><b>Section:</b> 20.5.2.1 [tuple.cnstr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
14368 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-09-15 <b>Last modified:</b> 2009-07-17</p>
14369 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#tuple.cnstr">active issues</a> in [tuple.cnstr].</p>
14370 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple.cnstr">issues</a> in [tuple.cnstr].</p>
14371 <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>
14372 <p><b>Discussion:</b></p>
14374 20.5.2.1 [tuple.cnstr]:
14377 <i>Effects:</i> Default initializes each element.
14381 Could be clarified to state each "non-trivial" element. Otherwise
14382 we have a conflict with Core deinfition of default initialization -
14383 trivial types do not get initialized (rather than initialization
14388 I'm going to punt on this one, because it's not an issue that's
14389 related to concepts. I suggest bringing it to Howard's attention on
14400 Text in draft doesn't mean anything, changing to "non-trivial" makes it
14404 We prefer "value initializes". Present implementations use
14405 value-initialization. Users who don't want value initialization have
14409 Request resolution text from Alisdair.
14413 This issue relates to Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#868">868</a> default construction and value-initialization.
14418 2009-05-04 Alisdair provided wording and adds:
14424 Note: This <em>IS</em> a change of semantic from TR1, although one the room agreed
14425 with during the discussion. To preserve TR1 semantics, this would have been
14428 <blockquote><pre>requires DefaultConstructible<Types>... tuple();
14431 -2- <i>Effects:</i> Default-initializes each non-trivial element.
14449 <p><b>Proposed resolution:</b></p>
14451 Change p2 in Construction 20.5.2.1 [tuple.cnstr]:
14454 <blockquote><pre>requires DefaultConstructible<Types>... tuple();
14458 -2- <i>Effects:</i> <del>Default</del> <ins>Value-</ins>initializes each element.
14469 <h3><a name="887"></a>887. issue with condition::wait_...</h3>
14470 <p><b>Section:</b> 30.5.1 [thread.condition.condvar] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
14471 <b>Submitter:</b> Lawrence Crowl <b>Opened:</b> 2008-09-15 <b>Last modified:</b> 2009-07-26</p>
14472 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.condition.condvar">active issues</a> in [thread.condition.condvar].</p>
14473 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.condition.condvar">issues</a> in [thread.condition.condvar].</p>
14474 <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>
14475 <p><b>Discussion:</b></p>
14477 The Posix/C++ working group has identified an inconsistency between
14478 Posix and the C++ working draft in that Posix requires the clock to be
14479 identified at creation, whereas C++ permits identifying the clock at the
14480 call to wait. The latter cannot be implemented with the former.
14490 Howard recommends NAD with the following explanation:
14494 The intent of the current wording is for the <tt>condtion_variable::wait_until</tt>
14495 be able to handle user-defined clocks as well as clocks the system knows about.
14496 This can be done by providing overloads for the known clocks, and another
14497 overload for unknown clocks which synchs to a known clock before waiting.
14501 <blockquote><pre>template <class Duration>
14503 condition_variable::wait_until(unique_lock<mutex>& lock,
14504 const chrono::time_point<chrono::system_clock, Duration>& abs_time)
14506 using namespace chrono;
14507 nanoseconds d = __round_up<nanoseconds>(abs_time.time_since_epoch());
14508 __do_timed_wait(lock.mutex()->native_handle(), time_point<system_clock, nanoseconds>(d));
14509 return system_clock::now() < abs_time;
14512 template <class Clock, class Duration>
14514 condition_variable::wait_until(unique_lock<mutex>& lock,
14515 const chrono::time_point<Clock, Duration>& abs_time)
14517 using namespace chrono;
14518 typename Clock::time_point c_entry = Clock::now();
14519 system_clock::time_point s_entry = system_clock::now();
14520 nanoseconds dn = __round_up<nanoseconds>(abs_time.time_since_epoch() -
14521 c_entry.time_since_epoch());
14522 __do_timed_wait(lock.mutex()->native_handle(), s_entry + dn);
14523 return Clock::now() < abs_time;
14525 </pre></blockquote>
14528 In the above example, <tt>system_clock</tt> is the only clock which the underlying
14529 condition variable knows how to deal with. One overload just passes that clock
14530 through. The second overload (approximately) converts the unknown clock into
14531 a <tt>system_clock time_point</tt> prior to passing it down to the native
14532 condition variable.
14536 On Posix systems vendors are free to add implementation defined constructors which
14537 take a clock. That clock can be stored in the condition_variable, and converted
14538 to (or not as necessary) as shown above.
14542 If an implementation defined constructor takes a clock (for example), then part
14543 of the semantics for that implementation defined ctor might include that a
14544 <tt>wait_until</tt> using a clock other than the one constructed with results
14545 in an error (exceptional condition) instead of a conversion to the stored clock.
14546 Such a design is up to the vendor as once an implementation defined ctor is used,
14547 the vendor is free to specifiy the behavior of waits and/or notifies however
14548 he pleases (when the cv is constructed in an implementation defined manner).
14559 "POSIX people will review the proposed NAD resolution at their upcoming NY
14564 See the minutes at: <a href="http://wiki.dinkumware.com/twiki/bin/view/Posix/POSIX-CppBindingWorkingGroupNewYork2009">http://wiki.dinkumware.com/twiki/bin/view/Posix/POSIX-CppBindingWorkingGroupNewYork2009</a>.
14578 2009-07-18 Detlef reopens the issue:
14584 On Friday afternoon in Frankfurt is was decided that 887 is NAD.
14585 This decision was mainly based on a sample implementation presented
14586 by Howard that implemented one clock on top of another.
14587 Unfortunately this implementation doesn't work for the probably most
14588 important case where a system has a monotonic clock and a real-time
14589 clock (or "wall time" clock):
14592 If the underlying "system_clock" is a monotonic clock, and
14593 the program waits on the real-time clock, and the real-time clock
14594 is set forward, the wait will unblock too late.
14598 If the underlying "system_clock" is a real-time clock, and the
14599 program waits on the monotonic clock, and the real-time clock
14600 is set back, the wait again will unblock too late.
14604 Sorry that I didn't remember this on Friday, but it was Friday
14605 afternoon after a busy week...
14609 So as the decision was made on a wrong asumption, I propose to re-open
14615 2009-07-26 Howard adds:
14621 Detlef correctly argues that <tt>condition_variable::wait_until</tt> could
14622 return "too late" in the context of clocks being adjusted during the wait. I agree
14623 with his logic. But I disagree that this makes this interface unimplementable
14628 The POSIX spec also does not guarantee that <tt>pthread_cond_timedwait</tt> does
14629 not return "too late" when clocks are readjusted during the wait. Indeed, the
14630 POSIX specification lacks any requirements at all concerning how soon
14631 <tt>pthread_cond_timedwait</tt> returns after a time out. This is evidently a
14632 QOI issue by the POSIX standard. Here is a quote of the most relevant normative
14633 text concerning <tt>pthread_cond_timedwait</tt> found
14634 <a href="http://www.unix.org/single_unix_specification/">here</a>.
14638 The <tt>pthread_cond_timedwait()</tt> function shall be equivalent to
14639 <tt>pthread_cond_wait()</tt>, except that an error is returned if the absolute
14640 time specified by <tt>abstime</tt> passes (that is, system time equals or exceeds
14641 <tt>abstime</tt>) before the condition <tt>cond</tt> is signaled or broadcasted, or if the
14642 absolute time specified by <tt>abstime</tt> has already been passed at the time
14647 I.e. the POSIX specification speaks of the error code returned in case of a time
14648 out, but not on the timeliness of that return.
14652 Might this simply be an oversight, or minor defect in the POSIX specification?
14656 I do not believe so. This same section goes on to say in <em>non-normative</em>
14661 For cases when the system clock is advanced discontinuously by an
14662 operator, it is expected that implementations process any timed wait
14663 expiring at an intervening time as if that time had actually occurred.
14667 Here is non-normative wording encouraging the implementation to ignore an advancing
14668 underlying clock and subsequently causing an early (spurious) return. There is
14669 no wording at all which addresses Detlef's example of a "late return". With
14670 <tt>pthread_cond_timedwait</tt> this would be caused by setting the system clock
14671 backwards. It seems reasonable to assume, based on the wording that is already
14672 in the POSIX spec, that again, the discontinuously changed clock would be ignored
14673 by <tt>pthread_cond_timedwait</tt>.
14677 A noteworthy difference between <tt>pthread_cond_timedwait</tt> and
14678 <tt>condition_variable::wait_until</tt> is that the POSIX spec appears to
14679 say that <tt>ETIMEDOUT</tt> should be returned if <tt>pthread_cond_timedwait</tt>
14680 returns because of timeout signal, whether or not the system clock was discontinuously
14681 advanced during the wait. In contrast <tt>condition_variable::wait_until</tt>
14685 <blockquote><pre><tt>Clock::now() < abs_time</tt>
14686 </pre></blockquote>
14689 That is, the C++ spec requires that the clock be rechecked (detecting discontinuous
14690 adjustments during the wait) at the time of return. <tt>condition_variable::wait_until</tt>
14691 may indeed return early or late. But regardless it will return a value
14692 reflecting timeout status at the time of return (even if clocks have been adjusted).
14693 Of course the clock may be adjusted after the return value is computed but before the client has
14694 a chance to read the result of the return. Thus there are no iron-clad guarantees
14699 <tt>condition_variable::wait_until</tt> (and <tt>pthread_cond_timedwait</tt>)
14700 is little more than a convenience function for making sure
14701 <tt>condition_variable::wait</tt> doesn't hang for an unreasonable amount of
14702 time (where the client gets to define "unreasonable"). I do not think it
14703 is in anyone's interest to try to make it into anything more than that.
14707 I maintain that this is a useful and flexible specification in the spirit of
14708 C++, and is implementable on POSIX. The implementation technique described above
14709 is a reasonable approach. There may also be higher quality approaches. This
14710 specification, like the POSIX specification, gives a wide latitude for QOI.
14714 I continue to recommend NAD, but would not object to a clarifying note regarding
14715 the behavior of <tt>condition_variable::wait_until</tt>. At the moment, I do
14716 not have good wording for such a note, but welcome suggestions.
14723 <p><b>Proposed resolution:</b></p>
14732 <h3><a name="889"></a>889. thread::id comparisons</h3>
14733 <p><b>Section:</b> 30.3.1.1 [thread.thread.id] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
14734 <b>Submitter:</b> Lawrence Crowl <b>Opened:</b> 2008-09-15 <b>Last modified:</b> 2009-07-28</p>
14735 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.thread.id">issues</a> in [thread.thread.id].</p>
14736 <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>
14737 <p><b>Discussion:</b></p>
14739 <p><b>Addresses UK 324</b></p>
14742 The <tt>thread::id</tt> type supports the full set of comparison operators. This
14743 is substantially more than is required for the associative containers that
14744 justified them. Please place an issue against the threads library.
14754 Would depend on proposed extension to POSIX, or non-standard extension.
14755 What about hash? POSIX discussing op. POSIX not known to be considering
14756 support needed for hash, op.
14759 Group expresses support for putting ids in both unordered and ordered containers.
14764 post San Francisco:
14770 Howard: It turns out the current working paper
14771 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf">N2723</a>
14772 <i>already has</i> <tt>hash<thread::id></tt>
14773 (20.7 [function.objects], 20.7.17 [unord.hash]). We simply
14774 overlooked it in the meeting. It is a good thing we voted in favor of it
14789 Recommend to close as NAD. For POSIX, see if we need to add a function to
14790 convert <tt>pthread_t</tt> to integer.
14794 Post Summit, Alisdair adds:
14800 The recommendation for LWG-889/UK-324 is NAD, already specified.
14803 It is not clear to me that the specification is complete.
14806 In particular, the synopsis of <tt><functional></tt> in 20.7 [function.objects] does not mention <tt>hash< thread::id
14807 ></tt> nor <tt>hash< error_code ></tt>, although their
14808 existence is implied by 20.7.17 [unord.hash], p1.
14811 I am fairly uncomfortable putting the declaration for the
14812 <tt>thread_id</tt> specialization into <tt><functional></tt> as
14813 <tt>id</tt> is a nested class inside <tt>std::thread</tt>, so it implies
14814 that <tt><functional></tt> would require the definition of the
14815 <tt>thread</tt> class template in order to forward declared
14816 <tt>thread::id</tt> and form this specialization.
14819 It seems better to me that the dependency goes the other way around
14820 (<tt><thread></tt> will more typically make use of
14821 <tt><functional></tt> than vice-versa) and the
14822 <tt>hash<thread::id></tt> specialization be declared in the
14823 <tt><thread></tt> header.
14826 I think <tt>hash<error_code></tt> could go into either
14827 <tt><system_error></tt> or <tt><functional></tt> and have no
14828 immediate preference either way. However, it should clearly appear in
14829 the synopsis of one of these two.
14832 Recommend moving 889 back to open, and tying in a reference to UK-324.
14841 Howard observes that <tt>thread::id</tt> need not be a nested class;
14842 it could be a <tt>typedef</tt> for a more visible type.
14846 2009-05-24 Alisdair adds:
14850 I do not believe this is correct. <tt>thread::id</tt> is explicitly documents as a
14851 nested class, rather than as an unspecified typedef analogous to an
14852 iterator. If the intent is that this is not implemented as a nested class
14853 (under the as-if freedoms) then this is a novel form of standardese.
14862 Decided we want to move hash specialization for thread_id to the thread
14863 header. Alisdair to provide wording.
14867 2009-07-28 Alisdair provided wording, moved to Review.
14873 <p><b>Proposed resolution:</b></p>
14875 Add to 30.3 [thread.threads], p1 Header <tt><thread></tt> synopsis:
14878 <blockquote><pre><ins>template <class T> struct hash;
14879 template <> struct hash<thread::id>;</ins>
14880 </pre></blockquote>
14883 Add template specialization below class definition in 30.3.1.1 [thread.thread.id]
14886 <blockquote><pre><ins>template <>
14887 struct hash<thread::id> : public unary_function<thread::id, size_t> {
14888 size_t operator()(thread::id val) const;
14890 </pre></blockquote>
14893 Extend note in p2 30.3.1.1 [thread.thread.id] with second sentence:
14897 [<i>Note:</i> Relational operators allow <tt>thread::id</tt> objects to be used
14898 as keys in associative containers.
14899 <ins><tt>hash</tt> template specialization allow <tt>thread::id</tt> objects to be used as keys
14900 in unordered containers.</ins>
14901 — <i>end note</i>]
14905 Add new paragraph to end of 30.3.1.1 [thread.thread.id]
14908 <blockquote><pre><ins>template <> struct hash<thread::id>;</ins>
14911 An explicit specializations of the class template hash (20.7.17 [unord.hash])
14912 shall be provided for the values of type <tt>thread::id</tt>
14913 suitable for use as keys in unordered associative containers (23.5 [unord]).
14914 </ins></blockquote>
14922 <h3><a name="891"></a>891. std::thread, std::call_once issue</h3>
14923 <p><b>Section:</b> 30.3.1.2 [thread.thread.constr], 30.4.5.2 [thread.once.callonce] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
14924 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2008-09-15 <b>Last modified:</b> 2009-07-17</p>
14925 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.thread.constr">active issues</a> in [thread.thread.constr].</p>
14926 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.thread.constr">issues</a> in [thread.thread.constr].</p>
14927 <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>
14928 <p><b>Discussion:</b></p>
14930 I notice that the vararg overloads of <tt>std::thread</tt> and <tt>std::call_once</tt>
14931 (N2723 30.3.1.2 [thread.thread.constr] and 30.4.5.2 [thread.once.callonce]) are no longer specified in terms of
14932 <tt>std::bind</tt>; instead, some of the <tt>std::bind</tt> wording has been inlined into
14936 There are two problems with this.
14939 First, the specification (and implementation) in terms of <tt>std::bind</tt> allows, for example:
14942 <blockquote><pre>std::thread th( f, 1, std::bind( g ) );
14943 </pre></blockquote>
14946 which executes <tt>f( 1, g() )</tt> in a thread. This can be useful. The
14947 "inlined" formulation changes it to execute <tt>f( 1, bind(g) )</tt> in a thread.
14950 Second, assuming that we don't want the above, the specification has copied the wording
14954 <tt>INVOKE(func, w1, w2, ..., wN)</tt> (20.6.2) shall be a valid
14955 expression for some values <tt>w1, w2, ..., wN</tt>
14959 but this is not needed since we know that our argument list is args; it should simply be
14963 <tt>INVOKE(func, args...)</tt> (20.6.2) shall be a valid expression
14976 Post Summit Anthony provided proposed wording.
14986 Leave Open. Await decision for thread variadic constructor.
14991 <p><b>Proposed resolution:</b></p>
14993 Change paragraph 4 of 30.3.1.2 [thread.thread.constr] to:
14997 <pre>template <class F> explicit thread(F f);
14998 template <class F, class ...Args> thread(F&& f, Args&&... args);
15001 -4- <i>Requires:</i> <tt>F</tt> and each <tt>Ti</tt> in <tt>Args</tt>
15002 shall be <tt>CopyConstructible</tt> if an lvalue and otherwise
15003 <tt>MoveConstructible</tt>. <tt><i>INVOKE</i>(f, <del>w1, w2, ..., wN</del> <ins>args...</ins>)</tt>
15004 (20.6.2) shall be a valid expression<del> for some values <i>w1, w2, ...,
15005 wN</i>, where <tt>N == sizeof...(Args)</tt></del>.
15010 Change paragraph 1 of 30.4.5.2 [thread.once.callonce] to:
15013 <blockquote><pre>template<class Callable, class ...Args>
15014 void call_once(once_flag& flag, Callable func, Args&&... args);
15017 -1- <i>Requires:</i> The template parameters <tt>Callable></tt> and each
15018 <tt>Ti</tt> in <tt>Args</tt> shall be <tt>CopyConstructible</tt> if an
15019 lvalue and otherwise <tt>MoveConstructible</tt>. <tt><i>INVOKE</i>(func,
15020 <del>w1, w2, ..., wN</del> <ins>args...</ins>)</tt> (20.6.2) shall be a
15021 valid expression<del> for some values <i>w1, w2, ..., wN</i>, where
15022 <tt>N == sizeof...(Args)</tt></del>.
15031 <h3><a name="893"></a>893. std::mutex issue</h3>
15032 <p><b>Section:</b> 30.4.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>
15033 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2008-09-15 <b>Last modified:</b> 2009-07-31</p>
15034 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.mutex.class">active issues</a> in [thread.mutex.class].</p>
15035 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.mutex.class">issues</a> in [thread.mutex.class].</p>
15036 <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>
15037 <p><b>Duplicate of:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#905">905</a></p>
15038 <p><b>Discussion:</b></p>
15040 30.4.1.1 [thread.mutex.class]/27 (in
15041 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf">N2723</a>)
15042 says that the behavior is undefined if:
15045 <li>a thread that owns a <tt>mutex</tt> object calls <tt>lock()</tt> or
15046 <tt>try_lock()</tt> on that object</li>
15049 I don't believe that this is right. Calling <tt>lock()</tt> or <tt>try_lock()</tt> on a
15050 locked <tt>mutex</tt> is well defined in the general case. <tt>try_lock()</tt> is required
15051 to fail and return <tt>false</tt>. <tt>lock()</tt> is required to either throw an
15052 exception (and is allowed to do so if it detects deadlock) or to block
15053 until the <tt>mutex</tt> is free. These general requirements apply regardless of
15054 the current owner of the <tt>mutex</tt>; they should apply even if it's owned by
15055 the current thread.
15058 Making double <tt>lock()</tt> undefined behavior probably can be justified (even
15059 though I'd still disagree with the justification), but <tt>try_lock()</tt> on a
15060 locked <tt>mutex</tt> must fail.
15069 Move to open. Proposed resolution:
15073 In 30.4.1 [thread.mutex.requirements] paragraph 12, change the error
15074 condition for <tt>resource_deadlock_would_occur</tt> to: "if the implementation
15075 detects that a deadlock would occur"
15078 Strike 30.4.1.1 [thread.mutex.class] paragraph 3 bullet 2 "a thread that owns a mutex object
15079 calls <tt>lock()</tt> or <tt>try_lock()</tt> on that object, or"
15090 Move to Review. Alisdair to provide note.
15094 2009-07-31 Alisdair provided note.
15099 <p><b>Proposed resolution:</b></p>
15101 In 30.4.1 [thread.mutex.requirements] paragraph 12 change:
15108 <tt>resource_deadlock_would_occur</tt> -- if the <del>current thread already owns the mutex and is able
15109 to detect it</del> <ins>implementation detects that a deadlock would occur</ins>.
15116 Strike 30.4.1.1 [thread.mutex.class] paragraph 3 bullet 2:
15120 -3- The behavior of a program is undefined if:
15125 <del>a thread that owns a <tt>mutex</tt> object calls <tt>lock()</tt> or <tt>try_lock()</tt> on that object, or</del>
15132 Add the following note after p3 30.4.1.1 [thread.mutex.class]
15136 [<i>Note:</i> a program may deadlock if the thread that owns a <tt>mutex</tt>
15137 object calls <tt>lock()</tt> or <tt>try_lock()</tt> on that object. If the program can
15138 detect the deadlock, a <tt>resource_deadlock_would_occur</tt> error condition may
15139 be observed. — <i>end note</i>]
15148 <h3><a name="896"></a>896. Library thread safety issue</h3>
15149 <p><b>Section:</b> 20.8.10.2 [util.smartptr.shared] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15150 <b>Submitter:</b> Hans Boehm <b>Opened:</b> 2008-09-16 <b>Last modified:</b> 2009-07-17</p>
15151 <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>
15152 <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>
15153 <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>
15154 <p><b>Discussion:</b></p>
15156 It is unclear whether <tt>shared_ptr</tt> is thread-safe in the sense that
15157 multiple threads may simultaneously copy a <tt>shared_ptr</tt>. However this
15158 is a critical piece of information for the client, and it has significant
15159 impact on usability for many applications. (Detlef Vollman thinks it
15160 is currently clear that it is not thread-safe. Hans Boehm thinks
15161 it currently requires thread safety, since the <tt>use_count</tt> is not an
15162 explicit field, and constructors and assignment take a const reference
15163 to an existing <tt>shared_ptr</tt>.)
15170 Many multi-threaded usages are impossible. A thread-safe version can
15171 be used to destroy an object when the last thread drops it, something
15172 that is often required, and for which we have no other easy mechanism.
15175 Against thread-safety:
15178 The thread-safe version is well-known to be far more expensive, even
15179 if used by a single thread. Many applications, including all single-threaded
15190 Beman: this is a complicated issue, and would like to move this to Open
15191 and await comment from Peter Dimov; we need very careful and complete
15192 rationale for any decision we make; let's go slow
15195 Detlef: I think that <tt>shared_ptr</tt> should not be thread-safe.
15198 Hans: When you create a thread with a lambda, it in some cases makes it
15199 very difficult for the lambda to reference anything in the heap. It's
15200 currently ambiguous as to whether you can use a <tt>shared_ptr</tt> to get at an
15204 Leave in Open. Detlef will submit an alternative proposed resolution
15205 that makes <tt>shared_ptr</tt> explicitly unsafe.
15208 A third option is to support both threadsafe and non-safe share_ptrs,
15209 and to let the programmer decide which behavior they want.
15213 Beman: Peter, do you support the PR?
15221 Yes, I support the proposed resolution, and I certainly oppose any
15222 attempts to <tt>make shared_ptr</tt> thread-unsafe.
15225 I'd mildly prefer if
15228 [<i>Note:</i> This is true in spite of that fact that such functions often
15229 modify <tt>use_count()</tt> <i>--end note</i>]
15235 [<i>Note:</i> This is true in spite of that fact that such functions often
15236 cause a change in <tt>use_count()</tt> <i>--end note</i>]
15239 (or something along these lines) to emphasise that <tt>use_count()</tt> is not,
15240 conceptually, a variable, but a return value.
15253 Vote: Do we want one thread-safe shared pointer or two? If two, one
15254 would allow concurrent construction and destruction of shared pointers,
15255 and one would not be thread-safe. If one, then it would be thread-safe.
15258 No concensus on that vote.
15261 Hans to improve wording in consultation with Pete. Leave Open.
15267 <p><b>Proposed resolution:</b></p>
15269 Make it explicitly thread-safe, in this weak sense, as I believe was intended:
15272 Insert in 20.8.10.2 [util.smartptr.shared], before p5:
15276 For purposes of determining the presence of a data race,
15277 member functions do not modify <tt>const shared_ptr</tt> and
15278 const <tt>weak_ptr</tt> arguments, nor any objects they
15279 refer to. [<i>Note:</i> This is true in spite of that fact that such functions often
15280 cause a change in <tt>use_count()</tt> <i>--end note</i>]
15284 On looking at the text, I'm not sure we need a similar disclaimer
15285 anywhere else, since nothing else has the problem with the modified
15286 <tt>use_count()</tt>. I think Howard arrived at a similar conclusion.
15294 <h3><a name="897"></a>897. Forward_list issues... Part 2</h3>
15295 <p><b>Section:</b> 23.3.3.4 [forwardlist.modifiers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
15296 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2008-09-22 <b>Last modified:</b> 2009-07-18</p>
15297 <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>
15298 <p><b>Discussion:</b></p>
15300 This issue was split off from <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#892">892</a> at the request of the LWG.
15310 This issue is more complicated than it looks.
15313 paragraph 47: replace each <tt>(first, last) with (first, last]</tt>
15316 add a statement after paragraph 48 that complexity is O(1)
15319 remove the complexity statement from the first overload of splice_after
15322 We may have the same problems with other modifiers, like erase_after.
15323 Should it require that all iterators in the range (position, last] be
15329 There are actually 3 issues here:
15335 What value should <tt>erase_after</tt> return? With <tt>list</tt>, code often
15338 <blockquote><pre>for (auto i = l.begin(); i != l.end();)
15340 // inspect *i and decide if you want to erase it
15342 if (I want to erase *i)
15347 </pre></blockquote>
15349 I.e. the iterator returned from <tt>erase</tt> is useful for setting up the
15350 logic for operating on the next element. For <tt>forward_list</tt> this might
15351 look something like:
15353 <blockquote><pre>auto i = fl.before_begin();
15355 for (++ip1; ip1 != fl.end(); ++ip1)
15357 // inspect *(i+1) and decide if you want to erase it
15359 if (I want to erase *(i+1))
15360 i = fl.erase_after(i);
15365 </pre></blockquote>
15367 In the above example code, it is convenient if <tt>erase_after</tt> returns
15368 the element <i>prior</i> to the erased element (range) instead of the element
15369 <i>after</i> the erase element (range).
15375 <li>SGI slist returns an iterator referencing the element <i>after</i> the erased range.</li>
15376 <li>CodeWarrior slist returns an iterator referencing the element <i>before</i> the erased range.</li>
15379 There is not a strong technical argument for either solution over the other.
15385 With all other containers, operations always work on the range
15386 <tt>[first, last)</tt> and/or <i>prior to</i> the given <tt>position</tt>.
15389 With <tt>forward_list</tt>, operations sometimes work on the range
15390 <tt>(first, last]</tt> and/or <i>after</i> the given <tt>position</tt>.
15393 This is simply due to the fact that in order to operate on
15394 <tt>*first</tt> (with <tt>forward_list</tt>) one needs access to
15395 <tt>*(first-1)</tt>. And that's not practical with
15396 <tt>forward_list</tt>. So the operating range needs to start with <tt>(first</tt>,
15397 not <tt>[first</tt> (as the current working paper says).
15400 Additionally, if one is interested in splicing the range <tt>(first, last)</tt>,
15401 then (with <tt>forward_list</tt>), one needs practical (constant time) access to
15402 <tt>*(last-1)</tt> so that one can set the <i>next</i> field in this node to
15403 the proper value. As this is not possible with <tt>forward_list</tt>, one must
15404 specify the last element of interest instead of one past the last element of
15405 interest. The syntax for doing this is to pass <tt>(first, last]</tt> instead
15406 of <tt>(first, last)</tt>.
15409 With <tt>erase_after</tt> we have a choice of either erasing the range
15410 <tt>(first, last]</tt> <em>or</em> <tt>(first, last)</tt>. Choosing the latter
15413 <blockquote><pre>x.erase_after(pos, x.end());
15414 </pre></blockquote>
15417 With the former, the above statement is inconvenient or expensive due to the lack
15418 of constant time access to <tt>x.end()-1</tt>. However we could introduce:
15421 <blockquote><pre>iterator erase_to_end(const_iterator position);
15422 </pre></blockquote>
15429 The advantage of the former (<tt>(first, last]</tt>) for <tt>erase_after</tt>
15430 is a consistency with <tt>splice_after</tt> which uses <tt>(first, last]</tt>
15431 as the specified range. But this either requires the addition of <tt>erase_to_end</tt>
15432 or giving up such functionality.
15438 As stated in the discussion of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#892">892</a>, and reienforced by point 2 above,
15439 a <tt>splice_after</tt> should work on the source range <tt>(first, last]</tt>
15440 if the operation is to be <i>Ο</i>(1). When splicing an entire list <tt>x</tt> the
15441 algorithm needs <tt>(x.before_begin(), x.end()-1]</tt>. Unfortunately <tt>x.end()-1</tt>
15442 is not available in constant time unless we specify that it must be. In order to
15443 make <tt>x.end()-1</tt> available in constant time, the implementation would have
15444 to dedicate a pointer to it. I believe the design of
15445 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2543.htm">N2543</a>
15446 intended a nominal overhead of <tt>foward_list</tt> of 1 pointer. Thus splicing
15447 one <i>entire</i> <tt>forward_list</tt> into another can not be <i>Ο</i>(1).
15457 We agree with the proposed resolution.
15471 We may need a new issue to correct splice_after, because it may no
15472 longer be correct to accept an rvalues as an argument. Merge may be
15473 affected, too. This might be issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1133">1133</a>. (Howard: confirmed)
15476 Move this to Ready, but the Requires clause of the second form of
15477 splice_after should say "(first, last)," not "(first, last]" (there are
15478 three occurrences). There was considerable discussion on this. (Howard: fixed)
15481 Alan suggested removing the "foward_last<T. Alloc>&& x"
15482 parameter from the second form of splice_after, because it is redundant.
15483 PJP wanted to keep it, because it allows him to check for bad ranges
15484 (i.e. "Granny knots").
15487 We prefer to keep <tt>x</tt>.
15490 Beman. Whenever we deviate from the customary half-open range in the
15491 specification, we should add a non-normative comment to the standard
15492 explaining the deviation. This clarifies the intention and spares the
15493 committee much confusion in the future.
15496 Alan to write a non-normative comment to explain the use of fully-closed ranges.
15499 Move to Ready, with the changes described above. (Howard: awaiting note from Alan)
15505 <p><b>Proposed resolution:</b></p>
15507 Wording below assumes issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#878">878</a> is accepted, but this issue is
15508 independent of that issue.
15512 Change 23.3.3.4 [forwardlist.modifiers]:
15516 <pre>iterator erase_after(const_iterator position);
15520 <i>Requires:</i> The iterator following <tt>position</tt> is dereferenceable.
15523 <i>Effects:</i> Erases the element pointed to by the iterator following <tt>position</tt>.
15526 <i>Returns:</i> <del>An iterator pointing to the element following the one that was erased, or <tt>end()</tt> if no such
15527 element exists</del>
15528 <ins>An iterator equal to <tt>position</tt></ins>.
15533 <pre>iterator erase_after(const_iterator position, <ins>const_</ins>iterator last);
15537 <i>Requires:</i> All iterators in the range
15538 <tt><del>[</del><ins>(</ins>position,last)</tt>
15539 are dereferenceable.
15542 <i>Effects:</i> Erases the elements in the range
15543 <tt><del>[</del><ins>(</ins>position,last)</tt>.
15546 <i>Returns:</i> <ins>An iterator equal to <tt>position</tt></ins> <del><tt>last</tt></del>
15552 Change 23.3.3.5 [forwardlist.ops]:
15556 <pre>void splice_after(const_iterator position, forward_list<T,Allocator>&& x);
15560 <i>Requires:</i> <tt>position</tt> is <tt>before_begin()</tt> or a
15561 dereferenceable iterator in the range <tt>[begin(), end))</tt>. <tt>&x != this</tt>.
15564 <i>Effects:</i> Inserts the contents of <tt>x</tt> after <tt>position</tt>, and
15565 <tt>x</tt> becomes empty. Pointers and references to
15566 the moved elements of <tt>x</tt> now refer to those same elements but as members of <tt>*this</tt>.
15567 Iterators referring to the moved elements will continue to refer to their elements,
15568 but they now behave as iterators into <tt>*this</tt>, not into <tt>x</tt>.
15571 <i>Throws:</i> Nothing.
15574 <i>Complexity:</i> <del><i>Ο</i>(1)</del> <ins><i>Ο</i>(<tt>distance(x.begin(), x.end())</tt>)</ins>
15580 <pre>void splice_after(const_iterator position, forward_list<T,Allocator>&& x,
15581 const_iterator first, const_iterator last);
15585 <i>Requires:</i> <tt>position</tt> is <tt>before_begin()</tt> or a
15586 dereferenceable iterator in the range <tt>[begin(), end))</tt>.
15587 <tt>(first,last)</tt> is a valid range in
15588 <tt>x</tt>, and all iterators in the range
15589 <tt>(first,last)</tt> are dereferenceable.
15590 <tt>position</tt> is not an iterator in the range <tt>(first,last)</tt>.
15593 <i>Effects:</i> Inserts elements in the range <tt>(first,last)</tt>
15594 after <tt>position</tt> and removes the elements from <tt>x</tt>.
15595 Pointers and references to the moved elements of <tt>x</tt> now refer to
15596 those same elements but as members of <tt>*this</tt>. Iterators
15597 referring to the moved elements will continue to refer to their
15598 elements, but they now behave as iterators into <tt>*this</tt>, not into
15602 <ins><i>Complexity:</i> <i>Ο</i>(1).</ins>
15614 <h3><a name="900"></a>900. stream move-assignment</h3>
15615 <p><b>Section:</b> 27.9.1.8 [ifstream.assign] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15616 <b>Submitter:</b> Niels Dekker <b>Opened:</b> 2008-09-20 <b>Last modified:</b> 2009-07-26</p>
15617 <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>
15618 <p><b>Discussion:</b></p>
15621 appears that we have an issue similar to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#675">675</a> regarding the move-assignment of
15622 stream types. For example, when assigning to an <tt>std::ifstream</tt>,
15623 <tt>ifstream1</tt>, it seems preferable to close the file originally held by
15624 <tt>ifstream1</tt>:
15627 <blockquote><pre>ifstream1 = std::move(ifstream2);
15628 </pre></blockquote>
15632 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf">N2723</a>)
15633 specifies that the move-assignment of
15634 stream types like <tt>ifstream</tt> has the same effect as a swap:
15639 Assign and swap 27.9.1.8 [ifstream.assign]
15641 <pre>basic_ifstream& operator=(basic_ifstream&& rhs);
15644 <i>Effects:</i> <tt>swap(rhs)</tt>.
15654 Howard agrees with the analysis and the direction proposed.
15657 Move to Open pending specific wording to be supplied by Howard.
15667 Howard is going to write wording.
15671 2009-07-26 Howard provided wording.
15677 <p><b>Proposed resolution:</b></p>
15680 Change 27.8.1.2 [stringbuf.assign]/1:
15683 <blockquote><pre>basic_stringbuf& operator=(basic_stringbuf&& rhs);
15686 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15687 <ins>After the move assignment <tt>*this</tt> reflects the same observable
15688 state it would have if it had been move constructed from <tt>rhs</tt>
15689 (27.8.1.1 [stringbuf.cons]).
15695 Change 27.8.2.2 [istringstream.assign]/1:
15698 <blockquote><pre>basic_istringstream& operator=(basic_istringstream&& rhs);
15701 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15702 <ins>Move assigns the base and members of <tt>*this</tt> with the respective
15703 base and members of <tt>rhs</tt>.
15709 Change 27.8.3.2 [ostringstream.assign]/1:
15712 <blockquote><pre>basic_ostringstream& operator=(basic_ostringstream&& rhs);
15715 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15716 <ins>Move assigns the base and members of <tt>*this</tt> with the respective
15717 base and members of <tt>rhs</tt>.
15723 Change 27.8.5.1 [stringstream.assign]/1:
15726 <blockquote><pre>basic_stringstream& operator=(basic_stringstream&& rhs);
15729 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15730 <ins>Move assigns the base and members of <tt>*this</tt> with the respective
15731 base and members of <tt>rhs</tt>.
15737 Change 27.9.1.3 [filebuf.assign]/1:
15740 <blockquote><pre>basic_filebuf& operator=(basic_filebuf&& rhs);
15743 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15744 <ins>Begins by calling <tt>this->close()</tt>.
15745 After the move assignment <tt>*this</tt> reflects the same observable
15746 state it would have if it had been move constructed from <tt>rhs</tt>
15747 (27.9.1.2 [filebuf.cons]).
15753 Change 27.9.1.8 [ifstream.assign]/1:
15756 <blockquote><pre>basic_ifstream& operator=(basic_ifstream&& rhs);
15759 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15760 <ins>Move assigns the base and members of <tt>*this</tt> with the respective
15761 base and members of <tt>rhs</tt>.</ins>
15766 Change 27.9.1.12 [ofstream.assign]/1:
15769 <blockquote><pre>basic_ofstream& operator=(basic_ofstream&& rhs);
15772 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15773 <ins>Move assigns the base and members of <tt>*this</tt> with the respective
15774 base and members of <tt>rhs</tt>.</ins>
15779 Change 27.9.1.16 [fstream.assign]/1:
15782 <blockquote><pre>basic_fstream& operator=(basic_fstream&& rhs);
15785 -1- <i>Effects:</i> <del><tt>swap(rhs)</tt>.</del>
15786 <ins>Move assigns the base and members of <tt>*this</tt> with the respective
15787 base and members of <tt>rhs</tt>.</ins>
15797 <h3><a name="908"></a>908. Deleted assignment operators for atomic types must be volatile</h3>
15798 <p><b>Section:</b> 29.5 [atomics.types] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15799 <b>Submitter:</b> Anthony Williams <b>Opened:</b> 2008-09-26 <b>Last modified:</b> 2009-03-22</p>
15800 <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>
15801 <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>
15802 <p><b>Discussion:</b></p>
15804 <p><b>Addresses US 90</b></p>
15807 The deleted copy-assignment operators for the atomic types are not
15808 marked as volatile in N2723, whereas the assignment operators from the
15809 associated non-atomic types are. e.g.
15811 <blockquote><pre>atomic_bool& operator=(atomic_bool const&) = delete;
15812 atomic_bool& operator=(bool) volatile;
15813 </pre></blockquote>
15816 This leads to ambiguity when assigning a non-atomic value to a
15817 non-volatile instance of an atomic type:
15819 <blockquote><pre>atomic_bool b;
15821 </pre></blockquote>
15824 Both assignment operators require a standard conversions: the
15825 copy-assignment operator can use the implicit <tt>atomic_bool(bool)</tt>
15826 conversion constructor to convert <tt>false</tt> to an instance of
15827 <tt>atomic_bool</tt>, or <tt>b</tt> can undergo a qualification conversion in order to
15828 use the assignment from a plain <tt>bool</tt>.
15832 This is only a problem once issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#845">845</a> is applied.
15840 Move to open. Assign to Lawrence. Related to US 90 comment.
15844 <p><b>Proposed resolution:</b></p>
15846 Add volatile qualification to the deleted copy-assignment operator of
15847 all the atomic types:
15850 <blockquote><pre>atomic_bool& operator=(atomic_bool const&) <ins>volatile</ins> = delete;
15851 atomic_itype& operator=(atomic_itype const&) <ins>volatile</ins> = delete;
15852 </pre></blockquote>
15858 This will mean that the deleted copy-assignment operator will require
15859 <i>two</i> conversions in the above example, and thus be a worse match than
15860 the assignment from plain <tt>bool</tt>.
15868 <h3><a name="910"></a>910. Effects of MoveAssignable</h3>
15869 <p><b>Section:</b> 20.2.9 [concept.copymove] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
15870 <b>Submitter:</b> Alberto Ganesh Barbati <b>Opened:</b> 2008-09-29 <b>Last modified:</b> 2009-07-18</p>
15871 <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>
15872 <p><b>Discussion:</b></p>
15873 <p><b>Addresses UK 150</b></p>
15876 The description of the effect of <tt>operator=</tt> in the <tt>MoveAssignable</tt>
15877 concept, given in paragraph 7 is:
15880 <blockquote><pre>result_type T::operator=(T&& rv); // inherited from HasAssign<T, T&&>
15884 <i>Postconditions:</i> the constructed <tt>T</tt> object is equivalent to the value of
15885 <tt>rv</tt> before the assignment. [<i>Note:</i> there is no
15886 requirement on the value of <tt>rv</tt> after the assignment. <i>--end note</i>]
15891 The sentence contains a typo (what is the "constructed <tt>T</tt> object"?)
15892 probably due to a cut&paste from <tt>MoveConstructible</tt>. Moreover, the
15893 discussion of LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#675">675</a> shows that the postcondition is too generic
15894 and might not reflect the user expectations. An implementation of the
15895 move assignment that just calls <tt>swap()</tt> would always fulfill the
15896 postcondition as stated, but might have surprising side-effects in case
15897 the source rvalue refers to an object that is not going to be
15898 immediately destroyed. See LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#900">900</a> for another example. Due to
15899 the sometimes intangible nature of the "user expectation", it seems
15900 difficult to have precise normative wording that could cover all cases
15901 without introducing unnecessary restrictions. However a non-normative
15902 clarification could be a very helpful warning sign that swapping is not
15903 always the correct thing to do.
15907 2009-05-09 Alisdair adds:
15913 Issue 910 is exactly the reason BSI advanced the Editorial comment UK-150.
15916 The post-conditions after assignment are at a minimum that the object
15917 referenced by rv must be safely destructible, and the transaction should not
15918 leak resources. Ideally it should be possible to simply assign rv a new
15919 valid state after the call without invoking undefined behaviour, but any
15920 other use of the referenced object would depend upon additional guarantees
15926 2009-05-09 Howard adds:
15932 The intent of the rvalue reference work is that the moved from <tt>rv</tt> is
15933 a valid object. Not one in a singular state. If, for example, the moved from
15934 object is a <tt>vector</tt>, one should be able to do anything on that moved-from
15935 <tt>vector</tt> that you can do with any other <tt>vector</tt>. However you would
15936 first have to query it to find out what its current state is. E.g. it might have <tt>capacity</tt>,
15937 it might not. It might have a non-zero <tt>size</tt>, it might not. But regardless,
15938 you can <tt>push_back</tt> on to it if you want.
15942 That being said, most standard code is now conceptized. That is, the concepts
15943 list the only operations that can be done with templated types - whether or not
15944 the values have been moved from.
15948 Here is user-written code which must be allowed to be legal:
15950 <blockquote><pre>#include <vector>
15951 #include <cstdio>
15953 template <class Allocator>
15955 inspect(std::vector<double, Allocator>&& v)
15957 std::vector<double, Allocator> result(move(v));
15958 std::printf("moved from vector has %u size and %u capacity\n", v.size(), v.capacity());
15959 std::printf("The contents of the vector are:\n");
15960 typedef typename std::vector<double, Allocator>::iterator I;
15961 for (I i = v.begin(), e = v.end(); i != e; ++i)
15962 printf("%f\n", *i);
15967 std::vector<double> v1(100, 5.5);
15970 </pre></blockquote>
15973 The above program does not treat the moved-from <tt>vector</tt> as singular. It
15974 only treats it as a <tt>vector</tt> with an unknown value.
15977 I believe the current proposed wording is consistent with my view on this.
15986 We agree that the proposed resolution
15987 is an improvement over the current wording.
15996 Need to look at again without concepts.
16005 Walter will consult with Dave and Doug.
16010 <p><b>Proposed resolution:</b></p>
16012 In 20.2.9 [concept.copymove], replace the postcondition in paragraph 7 with:
16016 <i>Postconditions:</i> <tt>*this</tt> is equivalent to the value of <tt>rv</tt> before the
16017 assignment. [<i>Note:</i> there is no requirement on the value of <tt>rv</tt> after the
16018 assignment, but the
16019 effect should be unsurprising to the user even in case <tt>rv</tt> is not
16020 immediately destroyed. This may require that resources previously owned
16021 by <tt>*this</tt> are released instead of transferred to <tt>rv</tt>. <i>-- end note</i>]
16029 <h3><a name="911"></a>911. I/O streams and <tt>move/swap</tt> semantic</h3>
16030 <p><b>Section:</b> 27.7.1 [input.streams], 27.7.2 [output.streams] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16031 <b>Submitter:</b> Alberto Ganesh Barbati <b>Opened:</b> 2008-09-29 <b>Last modified:</b> 2009-07-27</p>
16032 <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>
16033 <p><b>Discussion:</b></p>
16035 Class template <tt>basic_istream</tt>, <tt>basic_ostream</tt> and <tt>basic_iostream</tt>
16036 implements public move constructors, move assignment operators and <tt>swap</tt>
16037 method and free functions. This might induce both the user and the
16038 compiler to think that those types are <tt>MoveConstructible</tt>, <tt>MoveAssignable</tt>
16039 and <tt>Swappable</tt>. However, those class templates fail to fulfill the user
16040 expectations. For example:
16043 <blockquote><pre>std::ostream os(std::ofstream("file.txt"));
16044 assert(os.rdbuf() == 0); // buffer object is not moved to os, file.txt has been closed
16046 std::vector<std::ostream> v;
16047 v.push_back(std::ofstream("file.txt"));
16048 v.reserve(100); // causes reallocation
16049 assert(v[0].rdbuf() == 0); // file.txt has been closed!
16051 std::ostream&& os1 = std::ofstream("file1.txt");
16052 os1 = std::ofstream("file2.txt");
16053 os1 << "hello, world"; // still writes to file1.txt, not to file2.txt!
16055 std::ostream&& os1 = std::ofstream("file1.txt");
16056 std::ostream&& os2 = std::ofstream("file2.txt");
16057 std::swap(os1, os2);
16058 os1 << "hello, world"; // writes to file1.txt, not to file2.txt!
16059 </pre></blockquote>
16062 This is because the move constructor, the move assignment operator and
16063 <tt>swap</tt> are all implemented through calls to <tt>std::basic_ios</tt> member
16064 functions <tt>move()</tt> and <tt>swap()</tt> that do not move nor swap the controlled
16065 stream buffers. That can't happen because the stream buffers may have
16070 Notice that for <tt>basic_streambuf</tt>, the member function <tt>swap()</tt> is
16071 protected. I believe that is correct and all of <tt>basic_istream</tt>,
16072 <tt>basic_ostream</tt>, <tt>basic_iostream</tt> should do the same as the move ctor, move
16073 assignment operator and swap member function are needed by the derived
16074 <tt>fstream</tt>s and <tt>stringstream</tt>s template. The free swap functions for
16075 <tt>basic_(i|o|io)stream</tt> templates should be removed for the same reason.
16084 We note that the rvalue swap functions have already been removed.
16087 Bill is unsure about making the affected functions protected;
16088 he believes they may need to be public.
16091 We are also unsure about removing the lvalue swap functions as proposed.
16105 It's not clear that the use case is compelling.
16108 Howard: This needs to be implemented and tested.
16113 2009-07-26 Howard adds:
16119 I started out thinking I would recommend NAD for this one. I've turned around
16120 to agree with the proposed resolution (which I've updated to the current draft).
16121 I did not fully understand Ganesh's rationale, and attempt to describe my
16122 improved understanding below.
16126 The move constructor, move assignment operator, and swap function are different
16127 for <tt>basic_istream</tt>, <tt>basic_ostream</tt> and <tt>basic_iostream</tt>
16128 than other classes. A timely conversation with Daniel reminded me of this long
16129 forgotten fact. These members are sufficiently different that they would be
16130 extremely confusing to use in general, but they are very much needed for derived
16136 The move constructor moves everything but the <tt>rdbuf</tt> pointer.
16139 The move assignment operator moves everything but the <tt>rdbuf</tt> pointer.
16142 The swap function swaps everything but the <tt>rdbuf</tt> pointer.
16147 The reason for this behavior is that for the std-derived classes (stringstreams,
16148 filestreams), the <tt>rdbuf</tt> pointer points back into the class itself
16149 (self referencing). It can't be swapped or moved. But this fact isn't born out
16150 at the <tt>stream</tt> level. Rather it is born out at the <tt>fstream</tt>/<tt>sstream</tt>
16151 level. And the lower levels just need to deal with that fact by not messing around
16152 with the <tt>rdbuf</tt> pointer which is stored down at the lower levels.
16156 In a nutshell, it is very confusing for all of those who are not so intimately
16157 related with streams that they've implemented them. And it is even fairly
16158 confusing for some of those who have (including myself). I do not think it is
16159 safe to swap or move <tt>istreams</tt> or <tt>ostreams</tt> because this will
16160 (by necessary design) separate stream state from streambuffer state. Derived
16161 classes (such as <tt>fstream</tt> and <tt>stringstream</tt> must be used to
16162 keep the stream state and stream buffer consistently packaged as one unit during
16167 I've implemented this proposal and am living with it day to day.
16174 <p><b>Proposed resolution:</b></p>
16176 27.7.1.1 [istream]: make the following member functions protected:
16179 <blockquote><pre>basic_istream(basic_istream&& rhs);
16180 basic_istream& operator=(basic_istream&& rhs);
16181 void swap(basic_istream& rhs);
16182 </pre></blockquote>
16185 Ditto: remove the swap free function signature
16188 <blockquote><pre><del>// swap:
16189 template <class charT, class traits>
16190 void swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);</del>
16191 </pre></blockquote>
16194 27.7.1.1.2 [istream.assign]: remove paragraph 4
16197 <blockquote><pre><del>template <class charT, class traits>
16198 void swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);</del>
16201 <del><i>Effects:</i> <tt>x.swap(y)</tt>.</del>
16206 27.7.1.5 [iostreamclass]: make the following member function protected:
16209 <blockquote><pre>basic_iostream(basic_iostream&& rhs);
16210 basic_iostream& operator=(basic_iostream&& rhs);
16211 void swap(basic_iostream& rhs);
16212 </pre></blockquote>
16215 Ditto: remove the swap free function signature
16218 <blockquote><pre><del>template <class charT, class traits>
16219 void swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);</del>
16220 </pre></blockquote>
16223 27.7.1.5.3 [iostream.assign]: remove paragraph 3
16226 <blockquote><pre><del>template <class charT, class traits>
16227 void swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);</del>
16230 <del><i>Effects:</i> <tt>x.swap(y)</tt>.</del>
16235 27.7.2.1 [ostream]: make the following member function protected:
16238 <blockquote><pre>basic_ostream(basic_ostream&& rhs);
16239 basic_ostream& operator=(basic_ostream&& rhs);
16240 void swap(basic_ostream& rhs);
16241 </pre></blockquote>
16244 Ditto: remove the swap free function signature
16247 <blockquote><pre><del>// swap:
16248 template <class charT, class traits>
16249 void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);</del>
16250 </pre></blockquote>
16253 27.7.2.3 [ostream.assign]: remove paragraph 4
16256 <blockquote><pre><del>template <class charT, class traits>
16257 void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);</del>
16260 <del><i>Effects:</i> <tt>x.swap(y)</tt>.</del>
16270 <h3><a name="915"></a>915. <tt>minmax</tt> with <tt>initializer_list</tt> should return
16271 <tt>pair</tt> of <tt>T</tt>, not <tt>pair</tt> of <tt>const T&</tt></h3>
16272 <p><b>Section:</b> 25.5.7 [alg.min.max] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16273 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-10-04 <b>Last modified:</b> 2009-07-14</p>
16274 <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>
16275 <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>
16276 <p><b>Discussion:</b></p>
16278 It seems that the proposed changes for
16279 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2772.pdf">N2772</a>
16280 were not clear enough in
16285 25.5.7 [alg.min.max], before p.23 + p.24 + before p. 27 + p. 28 say that the return
16286 type of the <tt>minmax</tt> overloads with an <tt>initializer_list</tt> is
16287 <tt>pair<const T&, const T&></tt>,
16288 which is inconsistent with the decision for the other <tt>min/max</tt> overloads which take
16289 a <tt>initializer_list</tt> as argument and return a <tt>T</tt>, not a <tt>const T&</tt>.
16290 Doing otherwise for <tt>minmax</tt> would easily lead to unexpected life-time
16291 problems by using <tt>minmax</tt> instead of <tt>min</tt> and <tt>max</tt> separately.
16299 We agree with the proposed resolution.
16300 Move to Tentatively Ready.
16309 Moved from Tentatively Ready to Open only because the wording needs to be
16310 tweaked for concepts removal.
16315 <p><b>Proposed resolution:</b></p>
16319 In 25 [algorithms]/2, header <tt><algorithm></tt> synopsis change as indicated:
16322 <blockquote><pre>template<<del>class</del><ins>LessThanComparable</ins> T>
16323 <ins>requires CopyConstructible<T></ins>
16324 pair<<del>const </del>T<del>&</del>, <del>const </del>T<del>&</del>>
16325 minmax(initializer_list<T> t);
16327 template<class T, <del>class</del><ins>StrictWeakOrder<auto, T></ins> Compare>
16328 <ins>requires CopyConstructible<T></ins>
16329 pair<<del>const </del>T<del>&</del>, <del>const </del>T<del>&</del>>
16330 minmax(initializer_list<T> t, Compare comp);
16331 </pre></blockquote>
16335 In 25.5.7 [alg.min.max] change as indicated (Begin: Just before p.20):
16337 <blockquote><pre>template<<del>class</del><ins>LessThanComparable</ins> T>
16338 <ins>requires CopyConstructible<T></ins>
16339 pair<<del>const </del>T<del>&</del>, <del>const </del>T<del>&</del>>
16340 minmax(initializer_list<T> t);
16344 <del>-20- <i>Requires:</i> <tt>T</tt> is <tt>LessThanComparable</tt> and
16345 <tt>CopyConstructible</tt>.</del>
16348 -21- <i>Returns:</i> <tt>pair<<del>const </del>T<del>&</del>, <del>const
16349 </del>T<del>&</del>>(x, y)</tt> where <tt>x</tt> is the
16350 smallest value and <tt>y</tt> the largest value in the <tt>initializer_list</tt>.
16355 <pre>template<class T, <del>class</del><ins>StrictWeakOrder<auto, T></ins> Compare>
16356 <ins>requires CopyConstructible<T></ins>
16357 pair<<del>const </del>T<del>&</del>, <del>const </del>T<del>&</del>>
16358 minmax(initializer_list<T> t, Compare comp);
16363 <del>-24- <i>Requires:</i> type <tt>T</tt> is <tt>LessThanComparable</tt> and <tt>CopyConstructible</tt>.</del>
16366 -25- <i>Returns:</i> <tt>pair<<del>const </del>T<del>&</del>, <del>const
16367 </del>T<del>&</del>>(x, y)</tt> where <tt>x</tt> is the
16368 smallest value and <tt>y</tt> largest value in the <tt>initializer_list</tt>.
16381 <h3><a name="916"></a>916. Redundant move-assignment operator of <tt>pair</tt> should be removed</h3>
16382 <p><b>Section:</b> 20.3.3 [pairs] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16383 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-10-04 <b>Last modified:</b> 2009-07-18</p>
16384 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#pairs">active issues</a> in [pairs].</p>
16385 <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>
16386 <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>
16387 <p><b>Discussion:</b></p>
16388 <p><b>see also <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#917">917</a>.</b></p>
16391 The current WP provides the following assignment operators for <tt>pair</tt>
16392 in 20.3.3 [pairs]/1:
16397 <pre>template<class U , class V>
16398 requires HasAssign<T1, const U&> && HasAssign<T2, const V&>
16399 pair& operator=(const pair<U , V>& p);
16403 <pre>requires MoveAssignable<T1> && MoveAssignable<T2> pair& operator=(pair&& p );
16407 <pre>template<class U , class V>
16408 requires HasAssign<T1, RvalueOf<U>::type> && HasAssign<T2, RvalueOf<V>::type>
16409 pair& operator=(pair<U , V>&& p);
16415 It seems that the functionality of (2) is completely covered by (3), therefore
16416 (2) should be removed.
16425 Bill believes the extra assignment operators are necessary for resolving
16426 ambiguities, but that does not mean it needs to be part of the specification.
16430 We recommend this be looked at in the context of the ongoing work
16431 related to the pair templates.
16441 Leave this open pending the removal of concepts from the WD.
16446 <p><b>Proposed resolution:</b></p>
16450 In 20.3.3 [pairs] p. 1, class <tt>pair</tt> and just before p. 13 remove the declaration:
16453 <blockquote><pre>requires MoveAssignable<T1> && MoveAssignable<T2> pair& operator=(pair&& p );
16454 </pre></blockquote>
16468 <h3><a name="917"></a>917. Redundant move-assignment operator of <tt>tuple</tt> should be removed</h3>
16469 <p><b>Section:</b> 20.5.2.1 [tuple.cnstr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16470 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-10-04 <b>Last modified:</b> 2009-07-18</p>
16471 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#tuple.cnstr">active issues</a> in [tuple.cnstr].</p>
16472 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple.cnstr">issues</a> in [tuple.cnstr].</p>
16473 <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>
16474 <p><b>Discussion:</b></p>
16475 <p><b>see also <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#916">916</a>.</b></p>
16477 N2770 (and thus now the WP) removed the
16478 non-template move-assignment operator from tuple's class definition,
16479 but the latter individual member description does still provide this
16480 operator. Is this (a) an oversight and can it (b) be solved as part of an
16485 Post Summit Daniel provided wording.
16495 We believe that the proposed resolution's part 1 is editorial.
16498 Regarding part 2, we either remove the specification as proposed,
16499 or else add back the declaration to which the specification refers.
16500 Alisdair and Bill prefer the latter.
16501 It is not immediately obvious whether the function is intended to be present.
16504 We recommend that the Project Editor restore the missing declaration
16505 and that we keep part 2 of the issue alive.
16518 Leave this open pending the removal of concepts from the WD.
16523 <p><b>Proposed resolution:</b></p>
16527 In 20.5.2 [tuple.tuple], class <tt>tuple</tt> just before member <tt>swap</tt> please
16528 change as indicated:
16531 This fixes an editorial loss between N2798 to N2800
16534 <blockquote><pre>template <class... UTypes>
16535 requires HasAssign<Types, const UTypes&>...
16536 <ins>tuple& operator=(const pair<UTypes...>&);</ins>
16538 template <class... UTypes>
16539 requires HasAssign<Types, RvalueOf<UTypes>::type>...
16540 <ins>tuple& operator=(pair<UTypes...>&&);</ins>
16541 </pre></blockquote>
16545 In 20.5.2.1 [tuple.cnstr], starting just before p. 11 please remove
16549 <blockquote><pre><del>requires MoveAssignable<Types>... tuple& operator=(tuple&& u);</del>
16553 <del>-11- <i>Effects:</i> Move-assigns each element of <tt>u</tt> to the corresponding
16554 element of <tt>*this</tt>.</del>
16557 <del>-12- <i>Returns:</i> <tt>*this</tt>.</del>
16569 <h3><a name="919"></a>919. (forward_)list specialized remove algorithms are over constrained</h3>
16570 <p><b>Section:</b> 23.3.3.5 [forwardlist.ops], 23.3.4.4 [list.ops] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16571 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2008-10-06 <b>Last modified:</b> 2009-07-21</p>
16572 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#forwardlist.ops">active issues</a> in [forwardlist.ops].</p>
16573 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#forwardlist.ops">issues</a> in [forwardlist.ops].</p>
16574 <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>
16575 <p><b>Discussion:</b></p>
16577 The signatures of <tt>forwardlist::remove</tt> and <tt>list::remove</tt>
16578 defined in 23.3.3.5 [forwardlist.ops] before 11 + 23.3.4.4 [list.ops] before 15:
16581 <blockquote><pre>requires EqualityComparable<T> void remove(const T& value);
16582 </pre></blockquote>
16585 are asymmetric to their predicate variants (which only require
16586 <tt>Predicate</tt>, <em>not</em> <tt>EquivalenceRelation</tt>) and with the free algorithm
16587 remove (which only require <tt>HasEqualTo</tt>). Also, nothing in the
16589 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf">N2723</a>
16590 implies that <tt>EqualityComparable</tt> should
16591 be the intended requirement.
16600 We agree with the proposed resolution,
16601 but would like additional input from concepts experts.
16609 2009-07-21 Alisdair adds:
16614 Current rationale and wording for this issue is built around concepts. I
16615 suggest the issue reverts to Open status. I believe there is enough of
16616 an issue to review after concepts are removed from the WP to re-examine
16617 the issue in Santa Cruz, rather than resolve as NAD Concepts.
16621 <p><b>Proposed resolution:</b></p>
16625 Replace in 23.3.3.5 [forwardlist.ops] before 11 and in 23.3.4.4 [list.ops] before 15
16628 <blockquote><pre>requires <del>EqualityComparable<T></del> <ins>HasEqualTo<T, T></ins> void remove(const T& value);
16629 </pre></blockquote>
16639 <h3><a name="920"></a>920. Ref-qualification support in the library</h3>
16640 <p><b>Section:</b> 20.7.15 [func.memfn] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16641 <b>Submitter:</b> Bronek Kozicki <b>Opened:</b> 2008-10-06 <b>Last modified:</b> 2009-05-23</p>
16642 <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>
16643 <p><b>Discussion:</b></p>
16645 Daniel Krügler wrote:
16650 Shouldn't above list be completed for &- and &&-qualified
16651 member functions This would cause to add:
16653 <blockquote><pre>template<Returnable R, class T, CopyConstructible... Args>
16654 unspecified mem_fn(R (T::* pm)(Args...) &);
16655 template<Returnable R, class T, CopyConstructible... Args>
16656 unspecified mem_fn(R (T::* pm)(Args...) const &);
16657 template<Returnable R, class T, CopyConstructible... Args>
16658 unspecified mem_fn(R (T::* pm)(Args...) volatile &);
16659 template<Returnable R, class T, CopyConstructible... Args>
16660 unspecified mem_fn(R (T::* pm)(Args...) const volatile &);
16661 template<Returnable R, class T, CopyConstructible... Args>
16662 unspecified mem_fn(R (T::* pm)(Args...) &&);
16663 template<Returnable R, class T, CopyConstructible... Args>
16664 unspecified mem_fn(R (T::* pm)(Args...) const &&);
16665 template<Returnable R, class T, CopyConstructible... Args>
16666 unspecified mem_fn(R (T::* pm)(Args...) volatile &&);
16667 template<Returnable R, class T, CopyConstructible... Args>
16668 unspecified mem_fn(R (T::* pm)(Args...) const volatile &&);
16669 </pre></blockquote>
16674 yes, absolutely. Thanks for spotting this. Without this change <tt>mem_fn</tt>
16675 cannot be initialized from pointer to ref-qualified member function. I
16676 believe semantics of such function pointer is well defined.
16680 Post Summit Daniel provided wording.
16690 We need to think about whether we really want to go down the proposed path
16691 of combinatorial explosion.
16692 Perhaps a Note would suffice.
16695 We would really like to have an implementation before proceeding.
16698 Move to Open, and recommend this be deferred until after the next
16699 Committee Draft has been issued.
16704 <p><b>Proposed resolution:</b></p>
16708 In 20.7 [function.objects]/2, header <tt><functional></tt> synopsis, just after
16709 the section "// 20.6.15, member function adaptors::" add the following
16710 declarations to the existing list:
16712 <blockquote><pre>template<Returnable R, class T, CopyConstructible... Args>
16713 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) &);
16714 template<Returnable R, class T, CopyConstructible... Args>
16715 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const &);
16716 template<Returnable R, class T, CopyConstructible... Args>
16717 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) volatile &);
16718 template<Returnable R, class T, CopyConstructible... Args>
16719 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const volatile &);
16720 template<Returnable R, class T, CopyConstructible... Args>
16721 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) &&);
16722 template<Returnable R, class T, CopyConstructible... Args>
16723 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const &&);
16724 template<Returnable R, class T, CopyConstructible... Args>
16725 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) volatile &&);
16726 template<Returnable R, class T, CopyConstructible... Args>
16727 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const volatile &&);
16728 </pre></blockquote>
16732 In 20.7.15 [func.memfn] add the following declarations to the existing
16735 <blockquote><pre>template<Returnable R, class T, CopyConstructible... Args>
16736 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) &);
16737 template<Returnable R, class T, CopyConstructible... Args>
16738 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const &);
16739 template<Returnable R, class T, CopyConstructible... Args>
16740 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) volatile &);
16741 template<Returnable R, class T, CopyConstructible... Args>
16742 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const volatile &);
16743 template<Returnable R, class T, CopyConstructible... Args>
16744 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) &&);
16745 template<Returnable R, class T, CopyConstructible... Args>
16746 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const &&);
16747 template<Returnable R, class T, CopyConstructible... Args>
16748 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) volatile &&);
16749 template<Returnable R, class T, CopyConstructible... Args>
16750 <i>unspecified</i> mem_fn(R (T::* pm)(Args...) const volatile &&);
16751 </pre></blockquote>
16755 The following text, most notably p.2 and p.3 which discuss influence
16756 of the cv-qualification on the definition of the base class's first template
16757 parameter remains unchanged.
16765 <h3><a name="921"></a>921. Rational Arithmetic should use template aliases</h3>
16766 <p><b>Section:</b> 20.4.1 [ratio.ratio] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
16767 <b>Submitter:</b> Pablo Halpern <b>Opened:</b> 2008-10-07 <b>Last modified:</b> 2009-07-21</p>
16768 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#ratio.ratio">active issues</a> in [ratio.ratio].</p>
16769 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ratio.ratio">issues</a> in [ratio.ratio].</p>
16770 <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>
16771 <p><b>Discussion:</b></p>
16773 The compile-time functions that operate on <tt>ratio<N,D></tt> require the
16774 cumbersome and error-prone "evaluation" of a <tt>type</tt> member using a
16775 meta-programming style that predates the invention of template aliases.
16776 Thus, multiplying three ratios <tt>a</tt>, <tt>b</tt>, and <tt>c</tt> requires the expression:
16779 <blockquote><pre>ratio_multiply<a, ratio_multiply<b, c>::type>::type
16780 </pre></blockquote>
16783 The simpler expression:
16786 <blockquote><pre>ratio_multiply<a, ratio_multiply<b, c>>
16787 </pre></blockquote>
16790 Could be used by if template aliases were employed in the definitions.
16800 Jens: not a complete proposed resolution: "would need to make similar change"
16803 Consensus: We agree with the direction of the issue.
16811 2009-05-11 Daniel adds:
16817 Personally I'm <em>not</em> in favor for the addition of:
16819 <blockquote><pre>typedef ratio type;
16820 </pre></blockquote>
16822 For a reader of the
16823 standard it's usage or purpose is unclear. I haven't seen similar examples
16824 of attempts to satisfy non-feature complete compilers.
16829 2009-05-11 Pablo adds:
16835 The addition of type to the <tt>ratio</tt> template allows the previous style
16836 (i.e., in the prototype implementations) to remain valid and permits the
16837 use of transitional library implementations for C++03 compilers. I do
16838 not feel strongly about its inclusion, however, and leave it up to the
16839 reviewers to decide.
16848 Bill asks for additional discussion in the issue
16849 that spells out more details of the implementation.
16850 Howard points us to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#948">948</a>
16851 which has at least most of the requested details.
16852 Tom is strongly in favor of overflow-checking at compile time.
16853 Pete points out that there is no change of functionality implied.
16854 We agree with the proposed resolution,
16855 but recommend moving the issue to Review
16856 to allow time to improve the discussion if needed.
16860 2009-07-21 Alisdair adds:
16865 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1121">1121</a> for a potentially incompatible proposal.
16869 <p><b>Proposed resolution:</b></p>
16875 In 20.4 [ratio]/3 change as indicated:
16878 <blockquote><pre>// ratio arithmetic
16879 template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_add<ins> = <em>see below</em></ins>;
16880 template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_subtract<ins> = <em>see below</em></ins>;
16881 template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_multiply<ins> = <em>see below</em></ins>;
16882 template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_divide<ins> = <em>see below</em></ins>;
16883 </pre></blockquote>
16887 In 20.4.1 [ratio.ratio], change as indicated:
16889 <blockquote><pre>namespace std {
16890 template <intmax_t N, intmax_t D = 1>
16893 <ins>typedef ratio type;</ins>
16894 static const intmax_t num;
16895 static const intmax_t den;
16898 </pre></blockquote>
16902 In 20.4.2 [ratio.arithmetic] change as indicated:
16905 <blockquote><pre>template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_add<ins> = <em>see below</em></ins><del>{
16906 typedef <em>see below</em> type;
16912 1 The <del>nested typedef</del> type <tt><ins>ratio_add<R1, R2></ins></tt>
16913 shall be a synonym for <tt>ratio<T1, T2></tt>
16914 where <tt>T1</tt> has the value <tt>R1::num * R2::den + R2::num * R1::den</tt> and <tt>T2</tt>
16915 has the value <tt>R1::den * R2::den</tt>.
16919 <blockquote><pre>template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_subtract<ins> = <em>see below</em></ins><del>{
16920 typedef <em>see below</em> type;
16925 2 The <del>nested typedef</del> type <tt><ins>ratio_subtract<R1, R2></ins></tt>
16926 shall be a synonym for <tt>ratio<T1, T2></tt>
16927 where <tt>T1</tt> has the value <tt>R1::num * R2::den - R2::num * R1::den</tt> and <tt>T2</tt>
16928 has the value <tt>R1::den * R2::den</tt>.
16932 <blockquote><pre>template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_multiply<ins> = <em>see below</em></ins><del>{
16933 typedef <em>see below</em> type;
16938 3 The <del>nested typedef</del> type <tt><ins>ratio_multiply<R1, R2></ins></tt>
16939 shall be a synonym for <tt>ratio<T1, T2></tt>
16940 where <tt>T1</tt> has the value <tt>R1::num * R2::num</tt> and <tt>T2</tt> has the value <tt>R1::den * R2::den</tt>.
16944 <blockquote><pre>template <class R1, class R2> <del>struct</del><ins>using</ins> ratio_divide<ins> = <em>see below</em></ins><del>{
16945 typedef <em>see below</em> type;
16950 4 The <del>nested typedef</del> type <tt><ins>ratio_divide<R1, R2></ins></tt>
16951 shall be a synonym for <tt>ratio<T1, T2></tt>
16952 where <tt>T1</tt> has the value <tt>R1::num * R2::den</tt> and <tt>T2</tt> has the value <tt>R1::den * R2::num</tt>.
16959 In 20.9.3.1 [time.duration.cons]/4 change as indicated:
16963 <i>Requires:</i> <tt>treat_as_floating_point<rep>::value</tt> shall be true or
16964 <tt>ratio_divide<Period2, period>::<del>type::</del>den</tt> shall be 1.[..]
16970 In 20.9.3.7 [time.duration.cast]/2 change as indicated:
16974 <i>Returns:</i> Let CF be <tt>ratio_divide<Period, typename
16975 ToDuration::period><del>::type</del></tt>, and [..]
16986 <h3><a name="923"></a>923. atomics with floating-point </h3>
16987 <p><b>Section:</b> 29 [atomics] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
16988 <b>Submitter:</b> Herb Sutter <b>Opened:</b> 2008-10-17 <b>Last modified:</b> 2009-05-01</p>
16989 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics">active issues</a> in [atomics].</p>
16990 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics">issues</a> in [atomics].</p>
16991 <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>
16992 <p><b>Discussion:</b></p>
16994 Right now, C++0x doesn't have <tt>atomic<float></tt>. We're thinking of adding
16995 the words to support it for TR2 (note: that would be slightly
16996 post-C++0x). If we need it, we could probably add the words.
16999 <b>Proposed resolutions:</b> Using <tt>atomic<FP>::compare_exchange</tt> (weak or
17000 strong) should be either:
17013 I propose Option 1 for C++0x for expediency. If someone wants to argue
17014 for Option 2, they need to say what exactly they want <tt>compare_exchange</tt>
17015 to mean in this case (IIRC, C++0x doesn't even assume IEEE 754).
17024 Move to open. Blocked until concepts for atomics are addressed.
17028 Post Summit Anthony adds:
17034 Recommend NAD. C++0x does have <tt>std::atomic<float></tt>, and both
17035 <tt>compare_exchange_weak</tt> and <tt>compare_exchange_strong</tt> are well-defined in
17036 this case. Maybe change the note in 29.6 [atomics.types.operations] paragraph 20 to:
17041 [<i>Note:</i> The effect of the compare-and-exchange operations is
17043 <blockquote><pre>if (!memcmp(object,expected,sizeof(*object)))
17046 *expected = *object;
17047 </pre></blockquote>
17050 This may result in failed comparisons for values that compare equal if
17051 the underlying type has padding bits or alternate representations of
17052 the same value. <i>-- end note</i>]
17060 <p><b>Proposed resolution:</b></p>
17062 Change the note in 29.6 [atomics.types.operations] paragraph 20 to:
17067 [<i>Note:</i> The effect of the compare-and-exchange operations is
17069 <blockquote><pre>if (<del>*object == *expected</del> <ins>!memcmp(object,expected,sizeof(*object))</ins>)
17072 *expected = *object;
17073 </pre></blockquote>
17076 This may result in failed comparisons for values that compare equal if
17077 the underlying type has padding bits or alternate representations of
17078 the same value.</ins> <i>-- end note</i>]
17088 <h3><a name="924"></a>924. structs with internal padding</h3>
17089 <p><b>Section:</b> 29 [atomics] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
17090 <b>Submitter:</b> Herb Sutter <b>Opened:</b> 2008-10-17 <b>Last modified:</b> 2009-03-22</p>
17091 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics">active issues</a> in [atomics].</p>
17092 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics">issues</a> in [atomics].</p>
17093 <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>
17094 <p><b>Discussion:</b></p>
17096 Right now, the <tt>compare_exchange_weak</tt> loop should rapidly converge on the
17097 padding contents. But <tt>compare_exchange_strong</tt> will require a bit more
17098 compiler work to ignore padding for comparison purposes.
17101 Note that this isn't a problem for structs with no padding, and we do
17102 already have one portable way to ensure that there is no padding that
17103 covers the key use cases: Have elements be the same type. I suspect that
17104 the greatest need is for a structure of two pointers, which has no
17105 padding problem. I suspect the second need is a structure of a pointer
17106 and some form of an integer. If that integer is <tt>intptr_t</tt>, there will be
17110 Related but separable issue: For unused bitfields, or other unused
17111 fields for that matter, we should probably say it's the programmer's
17112 responsibility to set them to zero or otherwise ensure they'll be
17113 ignored by <tt>memcmp</tt>.
17117 <b>Proposed resolutions:</b> Using
17118 <tt>atomic<struct-with-padding>::compare_exchange_strong</tt> should be either:
17131 I propose Option 1 for C++0x for expediency, though I'm not sure how to
17132 say it. I would be happy with Option 2, which I believe would mean that
17133 <tt>compare_exchange_strong</tt> would be implemented to avoid comparing padding
17134 bytes, or something equivalent such as always zeroing out padding when
17135 loading/storing/comparing. (Either implementation might require compiler
17145 Move to open. Blocked until concepts for atomics are addressed.
17149 Post Summit Anthony adds:
17154 The resoultion of LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#923">923</a> should resolve this issue as well.
17159 <p><b>Proposed resolution:</b></p>
17168 <h3><a name="926"></a>926. Sequentially consistent fences, relaxed operations and modification order</h3>
17169 <p><b>Section:</b> 29.3 [atomics.order] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
17170 <b>Submitter:</b> Anthony Williams <b>Opened:</b> 2008-10-19 <b>Last modified:</b> 2009-03-22</p>
17171 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics.order">issues</a> in [atomics.order].</p>
17172 <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>
17173 <p><b>Discussion:</b></p>
17174 <p><b>Addresses UK 313</b></p>
17177 There was an interesting issue raised over on comp.programming.threads
17178 today regarding the following example
17181 <blockquote><pre>// Thread 1:
17182 x.store(1, memory_order_relaxed); // SX
17183 atomic_thread_fence(memory_order_seq_cst); // F1
17184 y.store(1, memory_order_relaxed); // SY1
17185 atomic_thread_fence(memory_order_seq_cst); // F2
17186 r1 = y.load(memory_order_relaxed); // RY
17189 y.store(0, memory_order_relaxed); // SY2
17190 atomic_thread_fence(memory_order_seq_cst); // F3
17191 r2 = x.load(memory_order_relaxed); // RX
17192 </pre></blockquote>
17195 is the outcome <tt>r1 == 0</tt> and <tt>r2 == 0</tt> possible?
17198 I think the intent is that this is not possible, but I am not sure the
17199 wording guarantees that. Here is my analysis:
17202 Since all the fences are SC, there must be a total order between them.
17203 <tt>F1</tt> must be before <tt>F2</tt> in that order since they are in
17204 the same thread. Therefore <tt>F3</tt> is either before <tt>F1</tt>,
17205 between <tt>F1</tt> and <tt>F2</tt> or after <tt>F2</tt>.
17208 If <tt>F3</tt> is <em>after</em> <tt>F2</tt>, then we can apply 29.3 [atomics.order]p5 from
17209 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf">N2798</a>:
17213 For atomic operations <tt>A</tt> and <tt>B</tt> on an atomic object
17214 <tt>M</tt>, where <tt>A</tt> modifies <tt>M</tt> and <tt>B</tt> takes
17215 its value, if there are <tt>memory_order_seq_cst</tt> fences <tt>X</tt>
17216 and <tt>Y</tt> such that <tt>A</tt> is sequenced before <tt>X</tt>,
17217 <tt>Y</tt> is sequenced before <tt>B</tt>, and <tt>X</tt> precedes
17218 <tt>Y</tt> in <tt>S</tt>, then <tt>B</tt> observes either the effects of
17219 <tt>A</tt> or a later modification of <tt>M</tt> in its modification
17224 In this case, <tt>A</tt> is <tt>SX</tt>, <tt>B</tt> is <tt>RX</tt>, the
17225 fence <tt>X</tt> is <tt>F2</tt> and the fence <tt>Y</tt> is <tt>F3</tt>,
17226 so <tt>RX</tt> must see 1.
17229 If <tt>F3</tt> is <em>before</em> <tt>F2</tt>, this doesn't apply, but
17230 <tt>F3</tt> can therefore be before or after <tt>F1</tt>.
17233 If <tt>F3</tt> is <em>after</em> <tt>F1</tt>, the same logic applies, but this
17234 time the fence <tt>X</tt> is <tt>F1</tt>. Therefore again, <tt>RX</tt>
17238 Finally we have the case that <tt>F3</tt> is <em>before</em> <tt>F1</tt>
17239 in the SC ordering. There are now no guarantees about <tt>RX</tt>, and
17240 <tt>RX</tt> can see <tt>r2==0</tt>.
17243 We can apply 29.3 [atomics.order]p5 again. This time,
17244 <tt>A</tt> is <tt>SY2</tt>, <tt>B</tt> is <tt>RY</tt>, <tt>X</tt> is
17245 <tt>F3</tt> and <tt>Y</tt> is <tt>F1</tt>. Thus <tt>RY</tt> must observe
17246 the effects of <tt>SY2</tt> or a later modification of <tt>y</tt> in its
17247 modification order.
17250 Since <tt>SY1</tt> is sequenced before <tt>RY</tt>, <tt>RY</tt> must
17251 observe the effects of <tt>SY1</tt> or a later modification of
17252 <tt>y</tt> in its modification order.
17255 In order to ensure that <tt>RY</tt> sees <tt>(r1==1)</tt>, we must see
17256 that <tt>SY1</tt> is later in the modification order of <tt>y</tt> than
17260 We're now skating on thin ice. Conceptually, <tt>SY2</tt> happens-before
17261 <tt>F3</tt>, <tt>F3</tt> is SC-ordered before <tt>F1</tt>, <tt>F1</tt>
17262 happens-before <tt>SY1</tt>, so <tt>SY1</tt> is later in the
17263 modification order <tt>M</tt> of <tt>y</tt>, and <tt>RY</tt> must see
17264 the result of <tt>SY1</tt> (<tt>r1==1</tt>). However, I don't think the
17265 words are clear on that.
17269 Post Summit Hans adds:
17275 In my (Hans') view, our definition of fences will always be weaker than
17276 what particular hardware will guarantee. <tt>Memory_order_seq_cst</tt> fences
17277 inherently don't guarantee sequential consistency anyway, for good
17278 reasons (e.g. because they can't enforce a total order on stores).
17279 Hence I don't think the issue demonstrates a gross failure to achieve
17280 what we intended to achieve. The example in question is a bit esoteric.
17281 Hence, in my view, living with the status quo certainly wouldn't be a
17285 In any case, we should probably add text along the lines of the
17286 following between p5 and p6 in 29.3 [atomics.order]:
17289 [Note: <tt>Memory_order_seq_cst</tt> only ensures sequential consistency for a
17290 data-race-free program that uses exclusively <tt>memory_order_seq_cst</tt>
17291 operations. Any use of weaker ordering will invalidate this guarantee
17292 unless extreme care is used. In particular, <tt>memory_order_seq_cst</tt> fences
17293 only ensure a total order for the fences themselves. They cannot, in
17294 general, be used to restore sequential consistency for atomic operations
17295 with weaker ordering specifications.]
17299 Also see thread beginning at c++std-lib-23271.
17305 Herve's correction:
17310 Minor point, and sorry for the knee jerk reaction: I admit to having
17311 no knowledge of Memory_order_seq_cst, but my former boss (John Lakos)
17312 has ingrained an automatic introspection on the use of "only". I
17317 [Note: <tt>Memory_order_seq_cst</tt> ensures sequential consistency only
17318 for . . . . In particular, <tt>memory_order_seq_cst</tt> fences ensure a
17319 total order only for . . .
17322 Unless, of course, <tt>Memory_order_seq_cst</tt> really do nothing but ensure
17323 sequential consistency for a data-race-free program that uses
17324 exclusively <tt>memory_order_seq_cst</tt> operations.
17330 <p><b>Proposed resolution:</b></p>
17332 Add a new paragraph after 29.3 [atomics.order]p5 that says
17336 For atomic operations <tt>A</tt> and <tt>B</tt> on an atomic object
17337 <tt>M</tt>, where <tt>A</tt> and <tt>B</tt> modify <tt>M</tt>, if there
17338 are <tt>memory_order_seq_cst</tt> fences <tt>X</tt> and <tt>Y</tt> such
17339 that <tt>A</tt> is sequenced before <tt>X</tt>, <tt>Y</tt> is sequenced
17340 before <tt>B</tt>, and <tt>X</tt> precedes <tt>Y</tt> in <tt>S</tt>,
17341 then <tt>B</tt> occurs later than <tt>A</tt> in the modifiction order of
17350 <h3><a name="929"></a>929. Thread constructor</h3>
17351 <p><b>Section:</b> 30.3.1.2 [thread.thread.constr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
17352 <b>Submitter:</b> Anthony Williams <b>Opened:</b> 2008-10-23 <b>Last modified:</b> 2009-07-18</p>
17353 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.thread.constr">active issues</a> in [thread.thread.constr].</p>
17354 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.thread.constr">issues</a> in [thread.thread.constr].</p>
17355 <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>
17356 <p><b>Discussion:</b></p>
17358 <p><b>Addresses UK 323</b></p>
17361 The <tt>thread</tt> constructor for starting a new thread with a function and
17362 arguments is overly constrained by the signature requiring rvalue
17363 references for <tt>func</tt> and <tt>args</tt> and the <tt>CopyConstructible</tt> requirements
17364 for the elements of <tt>args</tt>. The use of an rvalue reference for the
17365 function restricts the potential use of a plain function name, since
17366 the type of the bound parameter will be deduced to be a function
17367 reference and decay to pointer-to-function will not happen. This
17368 therefore complicates the implementation in order to handle a simple
17369 case. Furthermore, the use of rvalue references for args prevents the
17370 array to pointer decay. Since arrays are not <tt>CopyConstructible</tt> or even
17371 <tt>MoveConstructible</tt>, this essentially prevents the passing of arrays as
17372 parameters. In particular it prevents the passing of string literals.
17373 Consequently a simple case such as
17376 <blockquote><pre>void f(const char*);
17377 std::thread t(f,"hello");
17378 </pre></blockquote>
17381 is ill-formed since the type of the string literal is <tt>const char[6]</tt>.
17385 By changing the signature to take all parameters by value we can
17386 eliminate the <tt>CopyConstructible</tt> requirement and permit the use of
17387 arrays, as the parameter passing semantics will cause the necessary
17388 array-to-pointer decay. They will also cause the function name to
17389 decay to a pointer to function and allow the implementation to handle
17390 functions and function objects identically.
17394 The new signature of the <tt>thread</tt> constructor for a function and
17398 <blockquote><pre>template<typename F,typename... Args>
17399 thread(F,Args... args);
17400 </pre></blockquote>
17403 Since the parameter pack <tt>Args</tt> can be empty, the single-parameter
17404 constructor that takes just a function by value is now redundant.
17414 I agree with everything Anthony says in this issue. However I believe we
17415 can optimize in such a way as to get the pass-by-value behavior with the
17416 pass-by-rvalue-ref performance. The performance difference is that the latter
17417 removes a <tt>move</tt> when passing in an lvalue.
17421 This circumstance is very analogous to <tt>make_pair</tt> (20.3.3 [pairs])
17422 where we started with passing by const reference, changed to pass by value to
17423 get pointer decay, and then changed to pass by rvalue reference, but modified with
17424 <tt>decay<T></tt> to retain the pass-by-value behavior. If we were to
17425 apply the same solution here it would look like:
17428 <blockquote><pre><del>template <class F> explicit thread(F f);</del>
17429 template <class F, class ...Args> thread(F&& f, Args&&... args);
17433 -4- <i>Requires:</i> <tt>F</tt> and each <tt>Ti</tt> in <tt>Args</tt> shall be <del><tt>CopyConstructible</tt>
17434 if an lvalue and otherwise</del> <tt>MoveConstructible</tt>.
17435 <tt><i>INVOKE</i>(f, w1, w2, ..., wN)</tt> (20.7.2 [func.require]) shall be a valid expression for
17436 some values <tt>w1, w2, ... , wN,</tt> where <tt>N == sizeof...(Args)</tt>.
17439 -5- <i>Effects:</i> Constructs an object of type <tt>thread</tt>
17440 <del>and executes <tt><i>INVOKE</i>(f, t1, t2, ..., tN)</tt> in a new
17441 thread of execution, where <tt>t1, t2, ..., tN</tt> are the values in <tt>args...</tt></del>.
17443 the following objects in memory which is accessible to a new thread of execution
17446 <blockquote><pre><ins>typename decay<F>::type g(std::forward<F>(f));</ins>
17447 <ins>tuple<typename decay<Args>::type...> w(std::forward<Args>(args)...);</ins>
17448 </pre></blockquote>
17450 <ins>The new thread of
17451 execution executes <tt><i>INVOKE</i>(g, wi...)</tt> where the <tt>wi...</tt> refers
17452 to the elements stored in the <tt>tuple w</tt>.</ins>
17453 Any return value from <tt>g</tt> is ignored.
17454 <del>If <tt>f</tt> terminates with an uncaught exception, <tt>std::terminate()</tt> shall be called.</del>
17455 <ins>If the evaluation of <tt><i>INVOKE</i>(g, wi...)</tt> terminates
17456 with an uncaught exception, <tt>std::terminate()</tt> shall be called [<i>Note:</i>
17457 <tt>std::terminate()</tt> could be called before entering <tt>g</tt>. -- <i>end note</i>]. Any
17458 exception thrown before the evaluation of <tt><i>INVOKE</i></tt> has started shall be
17459 catchable in the calling thread.</ins>
17465 Text referring to when <tt>terminate()</tt> is called was contributed by Ganesh.
17475 We agree with the proposed resolution,
17476 but would like the final sentence to be reworded
17477 since "catchable" is not a term of art (and is used nowhere else).
17488 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2901.pdf">N2901</a>.
17491 Howard to open a separate issue to remove (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1176">1176</a>).
17494 In Frankfurt there is no consensus for removing the variadic constructor.
17500 <p><b>Proposed resolution:</b></p>
17502 Modify the class definition of <tt>std::thread</tt> in 30.3.1 [thread.thread.class] to remove the
17503 following signature:
17506 <blockquote><pre><del>template<class F> explicit thread(F f);</del>
17507 template<class F, class ... Args> <ins>explicit</ins> thread(F&& f, Args&& ... args);
17508 </pre></blockquote>
17511 Modify 30.3.1.2 [thread.thread.constr] to replace the constructors prior to paragraph 4 with
17512 the single constructor as above. Replace paragraph 4 - 6 with the
17518 -4- <i>Requires:</i> <tt>F</tt> and each <tt>Ti</tt> in <tt>Args</tt> shall be <del><tt>CopyConstructible</tt>
17519 if an lvalue and otherwise</del> <tt>MoveConstructible</tt>.
17520 <tt><i>INVOKE</i>(f, w1, w2, ..., wN)</tt> (20.7.2 [func.require]) shall be a valid expression for
17521 some values <tt>w1, w2, ... , wN,</tt> where <tt>N == sizeof...(Args)</tt>.
17524 -5- <i>Effects:</i> Constructs an object of type <tt>thread</tt>
17525 <del>and executes <tt><i>INVOKE</i>(f, t1, t2, ..., tN)</tt> in a new
17526 thread of execution, where <tt>t1, t2, ..., tN</tt> are the values in <tt>args...</tt></del>.
17528 the following objects:</ins>
17530 <blockquote><pre><ins>typename decay<F>::type g(std::forward<F>(f));</ins>
17531 <ins>tuple<typename decay<Args>::type...> w(std::forward<Args>(args)...);</ins>
17532 </pre></blockquote>
17534 <ins>and executes <tt><i>INVOKE</i>(g, wi...)</tt> in a new thread of execution.
17535 These objects shall be destroyed when the new thread of execution completes.</ins>
17536 Any return value from <tt>g</tt> is ignored.
17537 <del>If <tt>f</tt> terminates with an uncaught exception, <tt>std::terminate()</tt> shall be called.</del>
17538 <ins>If the evaluation of <tt><i>INVOKE</i>(g, wi...)</tt> terminates
17539 with an uncaught exception, <tt>std::terminate()</tt> shall be called [<i>Note:</i>
17540 <tt>std::terminate()</tt> could be called before entering <tt>g</tt>. -- <i>end note</i>]. Any
17541 exception thrown before the evaluation of <tt><i>INVOKE</i></tt> has started shall be
17542 catchable in the calling thread.</ins>
17545 -6- <i>Synchronization:</i> The invocation of the constructor <i>happens before</i> the
17546 invocation of <del><tt>f</tt></del> <ins><tt>g</tt></ins>.
17556 <h3><a name="930"></a>930. Access to std::array data as built-in array type</h3>
17557 <p><b>Section:</b> 23.3.1 [array] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
17558 <b>Submitter:</b> Niels Dekker <b>Opened:</b> 2008-11-17 <b>Last modified:</b> 2009-07-31</p>
17559 <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>
17560 <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>
17561 <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>
17562 <p><b>Discussion:</b></p>
17565 The Working Draft (N2798) allows access to the elements of
17566 <tt>std::array</tt> by its <tt>data()</tt> member function:
17571 <h5>23.2.1.4 array::data [array.data]</h5>
17573 const T *data() const;
17581 Unfortunately, the result of <tt>std::array::data()</tt> cannot be bound
17582 to a reference to a built-in array of the type of <tt>array::elems</tt>.
17583 And <tt>std::array</tt> provides no other way to get a reference to
17584 <tt>array::elems</tt>.
17585 This hampers the use of <tt>std::array</tt>, for example when trying to
17586 pass its data to a C style API function:
17589 <pre> // Some C style API function.
17590 void set_path( char (*)[MAX_PATH] );
17592 std::array<char,MAX_PATH> path;
17593 set_path( path.data() ); // error
17594 set_path( &(path.data()) ); // error
17598 Another example, trying to pass the array data to an instance of another
17602 <pre> // Represents a 3-D point in space.
17603 class three_d_point {
17605 explicit three_d_point(const double (&)[3]);
17608 const std::array<double,3> coordinates = { 0, 1, 2 };
17609 three_d_point point1( coordinates.data() ); // error.
17610 three_d_point point2( *(coordinates.data()) ); // error.
17614 A user might be tempted to use <tt>std::array::elems</tt> instead, but
17615 doing so isn't recommended, because <tt>std::array::elems</tt> is "for
17616 exposition only". Note that Boost.Array users might already use
17617 <tt>boost::array::elems</tt>, as its documentation doesn't explicitly
17618 state that <tt>boost::array::elems</tt> is for exposition only:
17619 http://www.boost.org/doc/libs/1_36_0/doc/html/boost/array.html
17622 I can think of three options to solve this issue:
17625 Remove the words "exposition only" from the definition of
17626 <tt>std::array::elems</tt>, as well as the note saying that "elems is
17627 shown for exposition only."
17629 Change the signature of <tt>std::array::data()</tt>, so that it would
17630 return a reference to the built-in array, instead of a pointer to its
17633 Add extra member functions, returning a reference to the built-in array.
17636 Lawrence Crowl wrote me that it might be better to leave
17637 <tt>std::array::elems</tt> "for exposition only", to allow alternate
17638 representations to allocate the array data dynamically. This might be
17639 of interest to the embedded community, having to deal with very limited
17643 The second option, changing the return type of
17644 <tt>std::array::data()</tt>, would break backward compatible to current
17645 Boost and TR1 implementations, as well as to the other contiguous
17646 container (<tt>vector</tt> and <tt>string</tt>) in a very subtle way.
17647 For example, the following call to <tt>std::swap</tt> currently swap two
17648 locally declared pointers <tt>(data1, data2)</tt>, for any container
17649 type <tt>T</tt> that has a <tt>data()</tt> member function. When
17650 <tt>std::array::data()</tt> is changed to return a reference, the
17651 <tt>std::swap</tt> call may swap the container elements instead.
17654 <pre> template <typename T>
17655 void func(T& container1, T& container2)
17657 // Are data1 and data2 pointers or references?
17658 auto data1 = container1.data();
17659 auto data2 = container2.data();
17661 // Will this swap two local pointers, or all container elements?
17662 std::swap(data1, data2);
17667 The following concept is currently satisfied by all contiguous
17668 containers, but it no longer is for <tt>std::array</tt>, when
17669 <tt>array::data()</tt>
17670 is changed to return a reference (tested on ConceptGCC Alpha 7):
17673 <pre> auto concept ContiguousContainerConcept<typename T>
17675 typename value_type = typename T::value_type;
17676 const value_type * T::data() const;
17681 Still it's worth considering having <tt>std::array::data()</tt> return a
17682 reference, because it might be the most intuitive option, from a user's
17683 point of view. Nicolai Josuttis (who wrote <tt>boost::array</tt>)
17684 mailed me that he very much prefers this option.
17687 Note that for this option, the definition of <tt>data()</tt> would also
17688 need to be revised for zero-sized arrays, as its return type cannot be a
17689 reference to a zero-sized built-in array. Regarding zero-sized array,
17690 <tt>data()</tt> could throw an exception. Or there could be a partial
17691 specialization of <tt>std::array</tt> where <tt>data()</tt> returns
17692 <tt>T*</tt> or gets removed.
17695 Personally I prefer the third option, adding a new member function to
17696 <tt>std::array</tt>, overloaded for const and non-const access,
17697 returning a reference to the built-in array, to avoid those compatible
17698 issues. I'd propose naming the function <tt>std::array::c_array()</tt>,
17699 which sounds intuitive to me. Note that <tt>boost::array</tt> already
17700 has a <tt>c_array()</tt> member, returning a pointer, but Nicolai told
17701 me that this one is only there for historical reasons. (Otherwise a name
17702 like <tt>std::array::native_array()</tt> or
17703 <tt>std::array::builtin_array()</tt> would also be fine with me.)
17704 According to my proposed resolution, a zero-sized <tt>std::array</tt> does not need
17705 to have <tt>c_array()</tt>, while it is still required to have
17706 <tt>data()</tt> functions.
17717 Alisdair: Don't like p4 suggesting implementation-defined behaviour.
17720 Walter: What about an explicit conversion operator, instead of adding
17721 the new member function?
17724 Alisdair: Noodling about:
17726 <blockquote><pre>template<size_t N, ValueType T>
17731 // fantasy code starts here
17733 // crazy decltype version for grins only
17734 //requires True<(N>0)>
17735 //explict operator decltype(elems) & () { return elems; }
17737 // conversion to lvalue ref
17738 requires True<(N>0)>
17739 explict operator T(&)[N] () & { return elems; }
17741 // conversion to const lvalue ref
17742 requires True<(N>0)>
17743 explict operator const T(&)[N] () const & { return elems; }
17745 // conversion to rvalue ref using ref qualifiers
17746 requires True<(N>0)>
17747 explict operator T(&&)[N] () && { return elems; }
17749 // fantasy code ends here
17751 explicit operator bool() { return true; }
17753 </pre></blockquote>
17756 This seems legal but odd. Jason Merrill says currently a CWG issue 613
17757 on the non-static data member that fixes the error that current G++
17758 gives for the non-explicit, non-conceptualized version of this. Verdict
17759 from human compiler: seems legal.
17762 Some grumbling about zero-sized arrays being allowed and supported.
17765 Walter: Would this address the issue? Are we inclined to go this route?
17768 Alan: What would usage look like?
17770 <blockquote><pre>// 3-d point in space
17771 struct three_d_point
17773 explicit three_d_point(const double (&)[3]);
17776 void sink(double*);
17778 const std::array<double, 3> coordinates = { 0, 1, 2 };
17779 three_d_point point1( coordinates.data() ); //error
17780 three_d_point point2( *(coordinates.data()) ); // error
17781 three_d_point point3( coordinates ); // yay!
17783 sink(cooridinates); // error, no conversion
17784 </pre></blockquote>
17787 Recommended Open with new wording. Take the required clause and add the
17788 explicit conversion operators, not have a <tt>typedef</tt>. At issue still is use
17789 <tt>decltype</tt> or use <tt>T[N]</tt>. In favour of using <tt>T[N]</tt>, even though use of
17790 <tt>decltype</tt> is specially clever.
17796 Post Summit, further discussion in the thread starting with c++std-lib-23215.
17801 2009-07 post-Frankfurt (Saturday afternoon group):
17807 The idea to resolve the issue by adding explicit conversion operators
17808 was abandoned, because it would be inconvenient to use, especially when
17809 passing the array to a template function, as mentioned by Daniel. So we
17810 reconsidered the original proposed resolution, which appeared
17811 acceptable, except for its proposed changes to 23.3.1.6 [array.zero], which
17812 allowed <tt>c_array_type</tt> and <tt>c_array()</tt> to be absent for a zero-sized array.
17813 Alisdair argued that such wording would disallow certain generic use
17814 cases. New wording for 23.3.1.6 [array.zero] was agreed upon (Howard: and
17815 is reflected in the proposed resolution).
17823 2009-07-31 Alisdair adds:
17829 I will be unhappy voting the proposed resolution for 930 past review
17830 until we have implementation experience with reference qualifiers.
17831 Specifically, I want to understand the impact of the missing overload
17832 for <tt>const &&</tt> (if any.)
17836 If we think the issue is important enough it might be worthwhile
17837 stripping the ref qualifiers for easy progress next meeting, and opening
17838 yet another issue to put them back with experience.
17842 Recommend deferring any decision on splitting the issue until we get LWG
17843 feedback next meeting - I may be the lone dissenting voice if others are
17844 prepared to proceed without it.
17849 <p><b>Proposed resolution:</b></p>
17851 Add to the template definition of array, 23.3.1 [array]/3:
17856 typedef T c_array_type[N];
17857 c_array_type & c_array() &;
17858 c_array_type && c_array() &&;
17859 const c_array_type & c_array() const &;
17865 Add the following subsection to 23.3.1 [array], after 23.3.1.4 [array.data]:
17869 <h5><ins>23.2.1.5 array::c_array [array.c_array]</ins></h5>
17871 c_array_type & c_array() &;
17872 c_array_type && c_array() &&;
17873 const c_array_type & c_array() const &;
17877 <ins><i>Returns:</i> <tt>elems</tt>.</ins>
17886 Change Zero sized arrays 23.3.1.6 [array.zero]:
17894 The type <tt>c_array_type</tt> is unspecified for a zero-sized array.
17898 -3- The effect of calling <ins><tt>c_array()</tt>,</ins> <tt>front()</tt><ins>,</ins> or
17899 <tt>back()</tt> for a zero-sized array is implementation defined.
17909 <h3><a name="932"></a>932. <tt>unique_ptr(pointer p)</tt> for pointer deleter types</h3>
17910 <p><b>Section:</b> 20.8.9.2.1 [unique.ptr.single.ctor] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
17911 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2008-11-26 <b>Last modified:</b> 2009-07-27</p>
17912 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unique.ptr.single.ctor">active issues</a> in [unique.ptr.single.ctor].</p>
17913 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unique.ptr.single.ctor">issues</a> in [unique.ptr.single.ctor].</p>
17914 <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>
17915 <p><b>Discussion:</b></p>
17917 <p><b>Addresses US 79</b></p>
17920 20.8.9.2.1 [unique.ptr.single.ctor]/5 no longer requires for <tt>D</tt>
17921 not to be a pointer type. I believe this restriction was accidently removed
17922 when we relaxed the completeness reuqirements on <tt>T</tt>. The restriction
17923 needs to be put back in. Otherwise we have a run time failure that could
17924 have been caught at compile time:
17928 unique_ptr<int, void(*)(void*)> p1(malloc(sizeof(int))); <font color="#c80000">// should not compile</font>
17929 } <font color="#c80000">// p1.~unique_ptr() dereferences a null function pointer</font>
17930 unique_ptr<int, void(*)(void*)> p2(malloc(sizeof(int)), free); <font color="#c80000">// ok</font>
17931 </pre></blockquote>
17939 Recommend Tentatively Ready.
17948 Moved from Tentatively Ready to Open only because the wording needs to be
17949 improved for enable_if type constraining, possibly following Robert's
17960 We need to consider whether some requirements in the Requires paragraphs
17961 of [unique.ptr] should instead be Remarks.
17964 Leave Open. Howard to provide wording, and possibly demonstrate how this
17965 can be implemented using enable_if.
17970 2009-07-27 Howard adds:
17976 The two constructors to which this issue applies are not easily constrained
17977 with <tt>enable_if</tt> as they are not templated:
17980 <blockquote><pre>unique_ptr();
17981 explicit unique_ptr(pointer p);
17982 </pre></blockquote>
17985 To "SFINAE" these constructors away would take heroic effort such as specializing
17986 the entire <tt>unique_ptr</tt> class template on pointer deleter types. There
17987 is insufficient motivation for such heroics. Here is the expected and
17988 reasonable implementation for these constructors:
17991 <blockquote><pre>unique_ptr()
17994 static_assert(!is_pointer<deleter_type>::value,
17995 "unique_ptr constructed with null function pointer deleter");
17997 explicit unique_ptr(pointer p)
18000 static_assert(!is_pointer<deleter_type>::value,
18001 "unique_ptr constructed with null function pointer deleter");
18003 </pre></blockquote>
18006 I.e. just use <tt>static_assert</tt> to verify that the constructor is not
18007 instantiated with a function pointer for a deleter. The compiler will automatically
18008 take care of issuing a diagnostic if the deleter is a reference type (uninitialized
18013 In keeping with our discussions in Frankfurt, I'm moving this requirement on
18014 the implementation from the Requires paragraph to a Remarks paragraph.
18021 <p><b>Proposed resolution:</b></p>
18023 Change the description of the default constructor in 20.8.9.2.1 [unique.ptr.single.ctor]:
18026 <blockquote><pre>unique_ptr();
18030 -1- <i>Requires:</i> <tt>D</tt> shall be default constructible, and that construction
18031 shall not throw an exception. <del><tt>D</tt> shall
18032 not be a reference type or pointer type (diagnostic required).</del>
18035 <ins><i>Remarks:</i> A diagnostic shall be emitted if this constructor is instantiated
18036 when <tt>D</tt> is a pointer type or reference type.</ins>
18041 Add after 20.8.9.2.1 [unique.ptr.single.ctor]/8:
18044 <blockquote><pre>unique_ptr(pointer p);
18048 <ins><i>Remarks:</i> A diagnostic shall be emitted if this constructor is instantiated
18049 when <tt>D</tt> is a pointer type or reference type.</ins>
18058 <h3><a name="933"></a>933. Unique_ptr defect</h3>
18059 <p><b>Section:</b> 20.8.9.2.5 [unique.ptr.single.modifiers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
18060 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-11-27 <b>Last modified:</b> 2009-05-23</p>
18061 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unique.ptr.single.modifiers">issues</a> in [unique.ptr.single.modifiers].</p>
18062 <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>
18063 <p><b>Discussion:</b></p>
18065 If we are supporting stateful deleters, we need an overload for
18066 <tt>reset</tt> that
18067 takes a deleter as well.
18070 <blockquote><pre>void reset( pointer p, deleter_type d);
18071 </pre></blockquote>
18074 We probably need two overloads to support move-only deleters, and
18076 sounds uncomfortably like the two constructors I have been ignoring
18087 Howard comments that we have the functionality via move-assigment.
18095 <p><b>Proposed resolution:</b></p>
18104 <h3><a name="934"></a>934. <tt>duration</tt> is missing <tt>operator%</tt></h3>
18105 <p><b>Section:</b> 20.9.3 [time.duration] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
18106 <b>Submitter:</b> Terry Golubiewski <b>Opened:</b> 2008-11-30 <b>Last modified:</b> 2009-07-27</p>
18107 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#time.duration">active issues</a> in [time.duration].</p>
18108 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.duration">issues</a> in [time.duration].</p>
18109 <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>
18110 <p><b>Discussion:</b></p>
18112 <p><b>Addresses US 81</b></p>
18115 <tt>duration</tt> is missing <tt>operator%</tt>. This operator is convenient
18116 for computing where in a time frame a given <tt>duration</tt> lies. A
18117 motivating example is converting a <tt>duration</tt> into a "broken-down"
18118 time duration such as hours::minutes::seconds:
18121 <blockquote><pre>class ClockTime
18123 typedef std::chrono::hours hours;
18124 typedef std::chrono::minutes minutes;
18125 typedef std::chrono::seconds seconds;
18131 template <class Rep, class Period>
18132 explicit ClockTime(const std::chrono::duration<Rep, Period>& d)
18133 : hours_ (std::chrono::duration_cast<hours> (d)),
18134 minutes_(std::chrono::duration_cast<minutes>(d % hours(1))),
18135 seconds_(std::chrono::duration_cast<seconds>(d % minutes(1)))
18138 </pre></blockquote>
18146 Agree except that there is a typo in the proposed resolution. The member
18147 operators should be operator%=.
18155 We agree with the proposed resolution.
18156 Move to Tentatively Ready.
18165 Moved from Tentatively Ready to Open only because the wording needs to be
18166 improved for enable_if type constraining, possibly following Robert's
18177 Howard to open a separate issue (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1177">1177</a>) to handle the removal of member
18178 functions from overload sets, provide wording, and possibly demonstrate
18179 how this can be implemented using enable_if (see <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#947">947</a>).
18188 <p><b>Proposed resolution:</b></p>
18190 Add to the synopsis in 20.9 [time]:
18193 <blockquote><pre>template <class Rep1, class Period, class Rep2>
18194 duration<typename common_type<Rep1, Rep2>::type, Period>
18195 operator%(const duration<Rep1, Period>& d, const Rep2& s);
18196 template <class Rep1, class Period1, class Rep2, class Period2>
18197 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
18198 operator%(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
18199 </pre></blockquote>
18202 Add to the synopsis of <tt>duration</tt> in 20.9.3 [time.duration]:
18205 <blockquote><pre>template <class Rep, class Period = ratio<1>>
18209 <ins>duration& operator%=(const rep& rhs);</ins>
18210 <ins>duration& operator%=(const duration& d);</ins>
18213 </pre></blockquote>
18216 Add to 20.9.3.3 [time.duration.arithmetic]:
18220 <pre>duration& operator%=(const rep& rhs);
18224 <i>Effects:</i> <tt>rep_ %= rhs</tt>.
18227 <i>Returns:</i> <tt>*this</tt>.
18231 <pre>duration& operator%=(const duration& d);
18235 <i>Effects:</i> <tt>rep_ %= d.count()</tt>.
18238 <i>Returns:</i> <tt>*this</tt>.
18244 Add to 20.9.3.5 [time.duration.nonmember]:
18249 <pre>template <class Rep1, class Period, class Rep2>
18250 duration<typename common_type<Rep1, Rep2>::type, Period>
18251 operator%(const duration<Rep1, Period>& d, const Rep2& s);
18255 <i>Requires:</i> <tt>Rep2</tt> shall be implicitly convertible to <tt>CR(Rep1, Rep2)</tt> and
18256 <tt>Rep2</tt> shall not be an instantiation of <tt>duration</tt>. Diagnostic required.
18259 <i>Returns:</i> <tt>duration<CR, Period>(d) %= s</tt>.
18263 <pre>template <class Rep1, class Period1, class Rep2, class Period2>
18264 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
18265 operator%(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
18269 <i>Returns:</i> <tt>common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type(lhs) %= rhs</tt>.
18281 <h3><a name="935"></a>935. clock error handling needs to be specified</h3>
18282 <p><b>Section:</b> 20.9.5 [time.clock] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
18283 <b>Submitter:</b> Beman Dawes <b>Opened:</b> 2008-11-24 <b>Last modified:</b> 2009-05-23</p>
18284 <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>
18285 <p><b>Discussion:</b></p>
18287 Each of the three clocks specified in Clocks 20.9.5 [time.clock]
18288 provides the member function:
18291 <blockquote><pre>static time_point now();
18292 </pre></blockquote>
18295 The semantics specified by Clock requirements 20.9.1 [time.clock.req]
18296 make no mention of error handling. Thus the function may throw <tt>bad_alloc</tt>
18297 or an implementation-defined exception (17.6.4.10 [res.on.exception.handling]
18302 Some implementations of these functions on POSIX, Windows, and
18303 presumably on other operating systems, may fail in ways only detectable
18304 at runtime. Some failures on Windows are due to supporting chipset
18305 errata and can even occur after successful calls to a clock's <tt>now()</tt>
18310 These functions are used in cases where exceptions are not appropriate
18311 or where the specifics of the exception or cause of error need to be
18312 available to the user. See
18313 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2828.html">N2828</a>,
18314 <i>Library Support for hybrid error
18315 handling (Rev 1)</i>, for more specific discussion of use cases. Thus some change in
18316 the interface of now is required.
18320 The proposed resolution has been implemented in the Boost version of the
18321 chrono library. No problems were encountered.
18330 We recommend this issue be deferred until the next Committee Draft
18331 has been issued and the prerequisite paper has been accepted.
18339 <p><b>Proposed resolution:</b></p>
18341 Accept the proposed wording of
18342 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2828.html">N2828</a>,
18343 <i>Library Support for hybrid error handling (Rev 1)</i>.
18347 Change Clock requirements 20.9.1 [time.clock.req] as indicated:
18352 -2- In Table 55 <tt>C1</tt> and <tt>C2</tt> denote clock types. <tt>t1</tt> and
18353 <tt>t2</tt> are values returned by <tt>C1::now()</tt> where the call
18354 returning <tt>t1</tt> happens before (1.10) the call returning <tt>t2</tt> and
18355 both of these calls happen before <tt>C1::time_point::max()</tt>.
18356 <ins><tt>ec</tt> denotes an object of type <tt>error_code</tt>
18357 (19.5.2.2 [syserr.errcode.overview]).</ins>
18361 <caption>Table 55 -- Clock requirements</caption>
18363 <th>Expression</th><th>Return type</th><th>Operational semantics</th>
18373 <td><tt>C1::now()</tt></td>
18374 <td><tt>C1::time_point</tt></td>
18375 <td>Returns a <tt>time_point</tt> object representing the current point in time.
18380 <td><tt><ins>C1::now(ec)</ins></tt></td>
18381 <td><tt><ins>C1::time_point</ins></tt></td>
18382 <td><ins>Returns a <tt>time_point</tt> object representing the current point in time.</ins>
18389 Change Class system_clock 20.9.5.1 [time.clock.system] as indicated:
18392 <blockquote><pre>static time_point now(<ins>error_code& ec=throws()</ins>);
18393 </pre></blockquote>
18396 Change Class monotonic_clock 20.9.5.2 [time.clock.monotonic] as indicated:
18399 <blockquote><pre>static time_point now(<ins>error_code& ec=throws()</ins>);
18400 </pre></blockquote>
18403 Change Class high_resolution_clock 20.9.5.3 [time.clock.hires] as indicated:
18406 <blockquote><pre>static time_point now(<ins>error_code& ec=throws()</ins>);
18407 </pre></blockquote>
18415 <h3><a name="936"></a>936. Mutex type overspecified</h3>
18416 <p><b>Section:</b> 30.4.1 [thread.mutex.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
18417 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2008-12-05 <b>Last modified:</b> 2009-03-22</p>
18418 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.mutex.requirements">active issues</a> in [thread.mutex.requirements].</p>
18419 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.mutex.requirements">issues</a> in [thread.mutex.requirements].</p>
18420 <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>
18421 <p><b>Discussion:</b></p>
18423 30.4.1 [thread.mutex.requirements] describes the requirements for a type to be
18424 a "Mutex type". A Mutex type can be used as the template argument for
18425 the <tt>Lock</tt> type that's passed to <tt>condition_variable_any::wait</tt> (although
18426 <tt>Lock</tt> seems like the wrong name here, since <tt>Lock</tt> is given a different
18427 formal meaning in 30.4.3 [thread.lock]) and, although the WD doesn't quite say
18428 so, as the template argument for <tt>lock_guard</tt> and <tt>unique_lock</tt>.
18432 The requirements for a Mutex type include:
18437 <tt>m.lock()</tt> shall be well-formed and have [described] semantics, including a return type of <tt>void</tt>.
18440 <tt>m.try_lock()</tt> shall be well-formed and have [described] semantics, including a return type of <tt>bool</tt>.
18443 <tt>m.unlock()</tt> shall be well-formed and have [described] semantics, including a return type of <tt>void</tt>.
18448 Also, a Mutex type "shall not be copyable nor movable".
18452 The latter requirement seems completely irrelevant, and the three
18453 requirements on return types are tighter than they need to be. For
18454 example, there's no reason that <tt>lock_guard</tt> can't be instantiated with a
18455 type that's copyable. The rule is, in fact, that <tt>lock_guard</tt>, etc. won't
18456 try to copy objects of that type. That's a constraint on locks, not on
18457 mutexes. Similarly, the requirements for <tt>void</tt> return types are
18458 unnecessary; the rule is, in fact, that <tt>lock_guard</tt>, etc. won't use any
18459 returned value. And with the return type of <tt>bool</tt>, the requirement should
18460 be that the return type is convertible to <tt>bool</tt>.
18470 Move to open. Related to conceptualization and should probably be tackled as part of that.
18474 The intention is not only to place a constraint on what types such as
18475 <tt>lock_guard</tt> may do with mutex types, but on what any code, including user
18476 code, may do with mutex types. Thus the constraints as they are apply to
18477 the mutex types themselves, not the current users of mutex types in the
18481 This is a low priority issue; the wording as it is may be overly
18482 restrictive but this may not be a real issue.
18488 Post Summit Anthony adds:
18494 Section 30.4.1 [thread.mutex.requirements] conflates the
18495 requirements on a generic Mutex type (including user-supplied mutexes)
18496 with the requirements placed on the standard-supplied mutex types in an
18497 attempt to group everything together and save space.
18500 When applying concepts to chapter 30, I suggest that the concepts
18501 <tt>Lockable</tt> and <tt>TimedLockable</tt> embody the requirements for
18502 *use* of a mutex type as required by
18503 <tt>unique_lock/lock_guard/condition_variable_any</tt>. These should be
18504 relaxed as Pete describes in the issue. The existing words in 30.4.1 [thread.mutex.requirements] are requirements on all of
18505 <tt>std::mutex</tt>, <tt>std::timed_mutex</tt>,
18506 <tt>std::recursive_mutex</tt> and <tt>std::recursive_timed_mutex</tt>,
18507 and should be rephrased as such.
18513 <p><b>Proposed resolution:</b></p>
18522 <h3><a name="939"></a>939. Problem with <tt>std::identity</tt> and reference-to-temporaries</h3>
18523 <p><b>Section:</b> 20.7.6 [identity.operation] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
18524 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-12-11 <b>Last modified:</b> 2009-07-30</p>
18525 <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>
18526 <p><b>Discussion:</b></p>
18528 <tt>std::identity</tt> takes an argument of type <tt>T const &</tt>
18529 and returns a result of <tt>T const &</tt>.
18532 Unfortunately, this signature will accept a value of type other than <tt>T</tt> that
18533 is convertible-to-<tt>T</tt>, and then return a reference to the dead temporary. The
18534 constraint in the concepts version simply protects against returning
18535 reference-to-<tt>void</tt>.
18542 i/ Return-by-value, potentially slicing bases and rejecting non-copyable
18546 ii/ Provide an additional overload:
18548 <blockquote><pre>template< typename T >
18549 template operator( U & ) = delete;
18550 </pre></blockquote>
18552 This seems closer on intent, but moves beyond the original motivation for
18553 the operator, which is compatibility with existing (non-standard)
18557 iii/ Remove the <tt>operator()</tt> overload. This restores the original definition
18558 of the <tt>identity</tt>, although now effectively a type_trait rather than part of
18559 the perfect forwarding protocol.
18562 iv/ Remove <tt>std::identity</tt> completely; its original reason to exist is
18563 replaced with the <tt>IdentityOf</tt> concept.
18567 My own preference is somewhere between (ii) and (iii) - although I stumbled
18568 over the issue with a specific application hoping for resolution (i)!
18577 We dislike options i and iii, and option ii seems like overkill.
18578 If we remove it (option iv), implementers can still provide it under a
18582 Move to Open pending wording (from Alisdair) for option iv.
18587 2009-05-23 Alisdair provided wording for option iv.
18592 2009-07-20 Alisdair adds:
18598 I'm not sure why this issue was not discussed at Frankfurt (or I missed
18599 the discussion) but the rationale is now fundamentally flawed. With the
18600 removal of concepts, <tt>std::identity</tt> again becomes an important library
18601 type so we cannot simply remove it.
18604 At that point, we need to pick one of the other suggested resolutions,
18605 but have no guidance at the moment.
18610 2009-07-20 Howard adds:
18616 I believe the rationale for not addressing this issue in Frankfurt was that it did
18617 not address a national body comment.
18620 I also believe that removal of <tt>identity</tt> is still a practical option as
18621 my latest reformulation of <tt>forward</tt>, which is due to comments suggested
18622 at Summit, no longer uses <tt>identity</tt>. :-)
18625 <blockquote><pre>template <class T, class U,
18626 class = typename enable_if
18628 !is_lvalue_reference<T>::value ||
18629 is_lvalue_reference<T>::value &&
18630 is_lvalue_reference<U>::value
18632 class = typename enable_if
18634 is_same<typename remove_all<T>::type,
18635 typename remove_all<U>::type>::value
18639 forward(U&& t)
18641 return static_cast<T&&>(t);
18647 The above code assumes acceptance of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1120">1120</a> for the definition of
18648 <tt>remove_all</tt>. This is just to make the syntax a little more palatable.
18649 Without this trait the above is still very implementable.
18656 Paper with rationale is on the way ... <i>really</i>, I promise this time! ;-)
18661 2009-07-30 Daniel adds: See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#823">823</a> for an alternative resolution.
18666 <p><b>Proposed resolution:</b></p>
18668 Strike 20.2.1 [concept.transform] p3:
18672 <del>-4- <i>Note:</i> concept form of the identity type metafunction (20.7.6).</del>
18676 Strike from 20.7 [function.objects] p2:
18679 <blockquote><pre><del>// 20.7.6, identity operation:</del>
18680 <del>template <IdentityOf T> struct identity;</del>
18681 </pre></blockquote>
18684 Remove 20.7.6 [identity.operation] (whole subclause):
18688 <pre><del>template <IdentityOf T> struct identity {
18691 requires ReferentType<T>
18692 const T& operator()(const T& x) const;
18695 <del>requires ReferentType<T>
18696 const T& operator()(const T& x) const;</del>
18699 <del>-1- <i>Returns:</i> <tt>x</tt></del>
18709 <h3><a name="940"></a>940. <tt>std::distance</tt></h3>
18710 <p><b>Section:</b> 24.4 [iterator.operations] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
18711 <b>Submitter:</b> Thomas <b>Opened:</b> 2008-12-14 <b>Last modified:</b> 2009-07-18</p>
18712 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#iterator.operations">active issues</a> in [iterator.operations].</p>
18713 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iterator.operations">issues</a> in [iterator.operations].</p>
18714 <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>
18715 <p><b>Discussion:</b></p>
18717 <p><b>Addresses UK 270</b></p>
18720 Regarding the <tt>std::distance</tt> - function, 24.4 [iterator.operations]
18725 number of increments or decrements needed to get from first to last.
18728 This sentence is completely silent about the sign of the return value.
18729 24.4 [iterator.operations] / 1 gives more information about the
18730 underlying operations, but
18731 again no inferences about the sign can be made.
18732 Strictly speaking, that is taking that sentence literally, I think this
18733 sentence even implies a positive return value in all cases, as the
18734 number of increments or decrements is clearly a ratio scale variable,
18735 with a natural zero bound.
18738 Practically speaking, my implementations did what common sense and
18739 knowledge based on pointer arithmetic forecasts, namely a positive sign
18740 for increments (that is, going from <tt>first</tt> to <tt>last</tt> by <tt>operator++</tt>), and a
18741 negative sign for decrements (going from <tt>first</tt> to <tt>last</tt> by <tt>operator--</tt>).
18744 Here are my two questions:
18747 First, is that paragraph supposed to be interpreted in the way what I
18748 called 'common sense', that is negative sign for decrements ? I am
18749 fairly sure that's the supposed behavior, but a double-check here in
18750 this group can't hurt.
18753 Second, is the present wording (2003 standard version - no idea about
18754 the draft for the upcoming standard) worth an edit to make it a bit more
18755 sensible, to mention the sign of the return value explicitly ?
18765 My first thought was that resolution <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#204">204</a> would already cover the
18766 issue report, but it seems that current normative wording is in
18767 contradiction to that resolution:
18772 <a href="" ref="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf">N2798</a>,
18773 24.4 [iterator.operations]/ p.4 says:
18777 <i>Effects:</i> Returns the number of increments or decrements needed to get
18778 from <tt>first</tt> to <tt>last</tt>.
18782 IMO the part " or decrements" is in contradiction to p. 5 which says
18786 <i>Requires:</i> <tt>last</tt> shall be reachable from <tt>first</tt>.
18790 because "reachable" is defined in 24.2 [iterator.concepts]/7 as
18794 An iterator <tt>j</tt> is called reachable from an iterator <tt>i</tt> if and only if
18796 sequence of applications of the expression <tt>++i</tt> that makes <tt>i == j</tt>.[..]
18800 Here is wording that would be consistent with this definition of "reachable":
18804 Change 24.4 [iterator.operations] p4 as follows:
18808 <i>Effects:</i> Returns the number of increments <del>or decrements</del>
18809 needed to get from <tt>first</tt> to <tt>last</tt>.
18815 Thomas adds more discussion and an alternative view point
18816 <a href="http://groups.google.com/group/comp.std.c++/browse_thread/thread/e8e46dcda0a5d797#">here</a>.
18825 The proposed wording below was verbally agreed to. Howard provided.
18834 Pete reports that a recent similar change has been made
18835 for the <tt>advance()</tt> function.
18838 We agree with the proposed resolution.
18839 Move to Tentatively Ready.
18849 Moved from Tentatively Ready to Open only because the wording needs to be
18850 tweaked for concepts removal.
18859 Leave Open pending arrival of a post-Concepts WD.
18864 <p><b>Proposed resolution:</b></p>
18866 Change 24.4 [iterator.operations]:
18870 <pre>template <InputIterator Iter>
18871 Iter::difference_type
18872 distance(Iter first, Iter last);
18873 <del>template <RandomAccessIterator Iter>
18874 Iter::difference_type distance(Iter first, Iter last);</del>
18879 -4- <i>Effects:</i> Returns the number of increments <del>or decrements</del>
18880 needed to get from <tt>first</tt> to <tt>last</tt>.
18883 -5- <i>Requires:</i> <tt>last</tt> shall be reachable from <tt>first</tt>.
18887 <pre><ins>template <RandomAccessIterator Iter>
18888 Iter::difference_type distance(Iter first, Iter last);</ins>
18893 <ins>-6- <i>Effects:</i> Returns the number of increments or decrements
18894 needed to get from <tt>first</tt> to <tt>last</tt>.</ins>
18897 <ins>-7- <i>Requires:</i> <tt>last</tt> shall be reachable from <tt>first</tt>
18898 or <tt>first</tt> shall be reachable from <tt>last</tt>.</ins>
18911 <h3><a name="944"></a>944. <tt>atomic<bool></tt> derive from <tt>atomic_bool</tt>?</h3>
18912 <p><b>Section:</b> 29.5.3 [atomics.types.generic] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
18913 <b>Submitter:</b> Holger Grund <b>Opened:</b> 2008-12-19 <b>Last modified:</b> 2009-03-22</p>
18914 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics.types.generic">issues</a> in [atomics.types.generic].</p>
18915 <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>
18916 <p><b>Discussion:</b></p>
18918 I think it's fairly obvious that <tt>atomic<bool></tt> is supposed to be derived
18919 from <tt>atomic_bool</tt> (and otherwise follow the <tt>atomic<integral></tt> interface),
18920 though I think the current wording doesn't support this. I raised this
18921 point along with <tt>atomic<floating-point></tt> privately with Herb and I seem
18922 to recall it came up in the resulting discussion on this list. However,
18923 I don't see anything on the current libs issue list mentioning this
18928 29.5.3 [atomics.types.generic]/3 reads
18932 There are full specializations over the integral types on the atomic
18933 class template. For each integral type integral in the second column of
18934 table 121 or table 122, the specialization <tt>atomic<integral></tt> shall be
18935 publicly derived from the corresponding atomic integral type in the
18936 first column of the table. These specializations shall have trivial
18937 default constructors and trivial destructors.
18941 Table 121 does not include (<tt>atomic_bool</tt>, <tt>bool</tt>),
18942 so that this should probably be mentioned explicitly in the quoted paragraph.
18951 Move to open. Lawrence will draft a proposed resolution. Also, ask
18952 Howard to fix the title.
18956 Post Summit Anthony provided proposed wording.
18961 <p><b>Proposed resolution:</b></p>
18963 Replace paragraph 3 in 29.5.3 [atomics.types.generic] with
18967 -3- There are full specializations over the integral types on the <tt>atomic</tt>
18968 class template. For each integral type <tt>integral</tt> in the second column of
18969 table 121 or table 122, the specialization <tt>atomic<integral></tt> shall be
18970 publicly derived from the corresponding atomic integral type in the first
18971 column of the table.
18972 <ins>In addition, the specialization <tt>atomic<bool></tt>
18973 shall be publicly derived from <tt>atomic_bool</tt>.</ins>
18974 These specializations shall have trivial default
18975 constructors and trivial destructors.
18983 <h3><a name="947"></a>947. duration arithmetic: contradictory requirements</h3>
18984 <p><b>Section:</b> 20.9.3.5 [time.duration.nonmember] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
18985 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2008-12-20 <b>Last modified:</b> 2009-07-27</p>
18986 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.duration.nonmember">issues</a> in [time.duration.nonmember].</p>
18987 <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>
18988 <p><b>Discussion:</b></p>
18990 In 20.9.3.5 [time.duration.nonmember], paragraph 8 says that calling
18992 when <tt>rep</tt> is an instantiation of <tt>duration</tt> requires a diagnostic.
18993 That's followed by an <tt>operator/</tt> that takes two durations.
18994 So <tt>dur1 / dur2</tt> is legal under the second version,
18995 but requires a diagnostic under the first.
19004 Please see the thread starting with c++std-lib-22980 for more information.
19012 Move to Open, pending proposed wording (and preferably an implementation).
19016 2009-07-27 Howard adds:
19022 I've addressed this issue under the proposed wording for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1177">1177</a> which
19023 cleans up several places under 20.9.3 [time.duration] which used the
19024 phrase "diagnostic required".
19027 For clarity's sake, here is an example implementation of the constrained <tt>operator/</tt>:
19030 <blockquote><pre>template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value>
19031 struct __duration_divide_result
19035 template <class _Duration, class _Rep2,
19036 bool = is_convertible<_Rep2,
19037 typename common_type<typename _Duration::rep, _Rep2>::type>::value>
19038 struct __duration_divide_imp
19042 template <class _Rep1, class _Period, class _Rep2>
19043 struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true>
19045 typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type;
19048 template <class _Rep1, class _Period, class _Rep2>
19049 struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false>
19050 : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2>
19054 template <class _Rep1, class _Period, class _Rep2>
19056 typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
19057 operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
19059 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
19060 duration<_Cr, _Period> __r = __d;
19061 __r /= static_cast<_Cr>(__s);
19064 </pre></blockquote>
19067 <tt>__duration_divide_result</tt> is basically a custom-built <tt>enable_if</tt>
19068 that will contain <tt>type</tt> only if <tt>Rep2</tt> is not a <tt>duration</tt>
19069 and if <tt>Rep2</tt> is implicitly convertible to
19070 <tt>common_type<typename Duration::rep, Rep2>::type</tt>. <tt>__is_duration</tt>
19071 is simply a private trait that answers <tt>false</tt>, but is specialized for
19072 <tt>duration</tt> to answer <tt>true</tt>.
19076 The constrained <tt>operator%</tt> works identically.
19081 <p><b>Proposed resolution:</b></p>
19090 <h3><a name="950"></a>950. unique_ptr converting ctor shouldn't accept array form</h3>
19091 <p><b>Section:</b> 20.8.9.2.1 [unique.ptr.single.ctor] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
19092 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-08-01</p>
19093 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unique.ptr.single.ctor">active issues</a> in [unique.ptr.single.ctor].</p>
19094 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unique.ptr.single.ctor">issues</a> in [unique.ptr.single.ctor].</p>
19095 <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>
19096 <p><b>Discussion:</b></p>
19098 <tt>unique_ptr</tt>'s of array type should not convert to
19099 <tt>unique_ptr</tt>'s which do not have an array type.
19102 <blockquote><pre>struct Deleter
19104 void operator()(void*) {}
19109 unique_ptr<int[], Deleter> s;
19110 unique_ptr<int, Deleter> s2(std::move(s)); <font color="#c80000">// should not compile</font>
19112 </pre></blockquote>
19121 Walter: Does the "diagnostic required" apply to both arms of the "and"?
19124 Tom Plum: suggest to break into several sentences
19127 Walter: suggest "comma" before the "and" in both places
19139 The post-Summit comments have been applied to the proposed resolution.
19140 We now agree with the proposed resolution.
19141 Move to Tentatively Ready.
19150 Moved from Tentatively Ready to Open only because the wording needs to be
19151 improved for enable_if type constraining, possibly following Robert's
19156 2009-08-01 Howard updates wording and sets to Review.
19162 <p><b>Proposed resolution:</b></p>
19164 Change 20.8.9.2.1 [unique.ptr.single.ctor]:
19168 <pre>template <class U, class E> unique_ptr(unique_ptr<U, E>&& u);
19172 -20- <i>Requires:</i> If <tt>D</tt> is not a reference type,
19173 construction of the deleter <tt>D</tt> from an rvalue of type <tt>E</tt>
19174 shall be well formed and shall not throw an exception. <del>If <tt>D</tt> is
19175 a reference type, then <tt>E</tt> shall be the same type as <tt>D</tt>
19176 (diagnostic required). <tt>unique_ptr<U, E>::pointer</tt> shall be
19177 implicitly convertible to <tt>pointer</tt>. [<i>Note:</i> These requirements
19178 imply that <tt>T</tt> and <tt>U</tt> are complete types. — <i>end note</i>]</del>
19182 <i>Remarks:</i> If <tt>D</tt> is
19183 a reference type, then <tt>E</tt> shall be the same type as <tt>D</tt>, else this
19184 constructor shall not participate in overload resolution. <tt>unique_ptr<U, E>::pointer</tt> shall be
19185 implicitly convertible to <tt>pointer</tt>, else this
19186 constructor shall not participate in overload resolution. <tt>U</tt> shall not be
19187 an array type, else this
19188 constructor shall not participate in overload resolution. [<i>Note:</i> These requirements
19189 imply that <tt>T</tt> and <tt>U</tt> are complete types. — <i>end note</i>]
19196 Change 20.8.9.2.3 [unique.ptr.single.asgn]:
19200 <pre>template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u);
19204 -6- <i>Requires:</i> Assignment of the deleter <tt>D</tt> from an rvalue
19205 <tt>D</tt> shall not throw an exception. <del><tt>unique_ptr<U,
19206 E>::pointer</tt> shall be implicitly convertible to <tt>pointer</tt>.
19207 [<i>Note:</i> These requirements imply that <tt>T</tt> and <tt>U</tt>
19208 are complete types. — <i>end note</i>]</del>
19212 <i>Remarks:</i> <tt>unique_ptr<U,
19213 E>::pointer</tt> shall be implicitly convertible to <tt>pointer</tt>, else this
19214 operator shall not participate in overload resolution.
19215 <tt>U</tt> shall not be an array type, else this
19216 operator shall not participate in overload resolution.
19217 [<i>Note:</i> These requirements imply that <tt>T</tt> and <tt>U</tt>
19218 are complete types. — <i>end note</i>]
19230 <h3><a name="951"></a>951. Various threading bugs #1</h3>
19231 <p><b>Section:</b> 20.9.2.1 [time.traits.is_fp] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
19232 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-08-01</p>
19233 <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>
19234 <p><b>Discussion:</b></p>
19237 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#953">953</a>.
19241 20.9.2.1 [time.traits.is_fp] says that the type <tt>Rep</tt> "is
19242 assumed to be ... a class emulating an integral type." What are the
19243 requirements for such a type?
19246 2009-05-10 Howard adds:
19251 <tt>IntegralLike</tt>.
19260 As with issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#953">953</a>,
19261 we recommend this issue be addressed in the context of providing concepts for the entire <tt>thread</tt> header.
19264 We look forward to proposed wording.
19272 2009-08-01 Howard adds:
19278 I have surveyed all clauses of 20.9.2.2 [time.traits.duration_values],
19279 20.9.2.3 [time.traits.specializations] and 20.9.3 [time.duration].
19280 I can not find any clause which involves the use of a <tt>duration::rep</tt> type
19281 where the requirements on the <tt>rep</tt> type are not clearly spelled out.
19282 These requirements were carefully crafted to allow any arithmetic type, or
19283 any user-defined type emulating an arithmetic type.
19287 Indeed, <tt>treat_as_floating_point</tt>
19288 becomes completely superfluous if <tt>duration::rep</tt> can never be a class type.
19292 There will be some <tt>Rep</tt> types which will not meet the requirements of
19293 <em>every</em> <tt>duration</tt> operation. This is no different than the fact
19294 that <tt>vector<T></tt> can easily be used for types <tt>T</tt> which are
19295 not <tt>DefaultConstructible</tt>, even though some members of <tt>vector<T></tt>
19296 require <tt>T</tt> to be <tt>DefaultConstructible</tt>. This is why the requirements
19297 on <tt>Rep</tt> are specified for each operation individually.
19301 In 20.9.2.1 [time.traits.is_fp] p1:
19304 <blockquote><pre>template <class Rep> struct treat_as_floating_point
19305 : is_floating_point<Rep> { };
19309 The <tt>duration</tt> template uses the <tt>treat_as_floating_point</tt> trait to help
19310 determine if a <tt>duration</tt> object can be converted to another <tt>duration</tt>
19311 with a different tick period. If <tt>treat_as_floating_point<Rep>::value</tt> is
19312 <tt>true</tt>, then <tt>Rep</tt> is a floating-point type and implicit conversions are
19313 allowed among <tt>duration</tt>s. Otherwise, the implicit convertibility depends
19314 on the tick periods of the <tt>duration</tt>s. If <tt>Rep</tt> is <u>a class type which
19315 emulates a floating-point type</u>, the author of <tt>Rep</tt> can specialize
19316 <tt>treat_as_floating_point</tt> so that <tt>duration</tt> will treat this <tt>Rep</tt> as if it
19317 were a floating-point type. Otherwise <tt>Rep</tt> is assumed to be an integral
19318 type or <u>a class emulating an integral type</u>.
19323 The phrases "a class type which emulates a floating-point type" and
19324 "a class emulating an integral type" are clarifying phrases which refer to
19325 the summation of all the requirements on the <tt>Rep</tt> type specified in
19326 detail elsewhere (and <em>should not</em> be repeated here).
19330 This specification has been implemented, now multiple times, and the experience
19331 has been favorable. The current specification clearly specifies the requirements
19332 at each point of use (though I'd be happy to fix any place I may have missed,
19333 but none has been pointed out).
19337 I am amenable to improved wording of this paragraph (and any others), but to not have any
19338 suggestions for improved wording at this time. I am <em>strongly</em> opposed to
19339 changes which would significantly alter the semantics of the
19340 specification under 20.9 [time] without firmly grounded and
19341 documented rationale, example implementation, testing, and user
19342 experience which relates a positive experience.
19346 I recommend NAD unless someone wants to produce some clarifying wording.
19351 <p><b>Proposed resolution:</b></p>
19360 <h3><a name="953"></a>953. Various threading bugs #3</h3>
19361 <p><b>Section:</b> 20.9.1 [time.clock.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
19362 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-08-01</p>
19363 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#time.clock.req">active issues</a> in [time.clock.req].</p>
19364 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.clock.req">issues</a> in [time.clock.req].</p>
19365 <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>
19366 <p><b>Discussion:</b></p>
19369 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#951">951</a>.
19373 20.9.1 [time.clock.req] says that a clock's <tt>rep</tt> member is "an
19374 arithmetic type or a class emulating an arithmetic type." What are the
19375 requirements for such a type?
19379 2009-05-10 Howard adds:
19384 This wording was aimed directly at the <tt>ArithmeticLike</tt> concept.
19393 We recommend this issue be addressed in the context of providing concepts
19394 for the entire <tt>thread</tt> header.
19397 May resolve for now by specifying arithmetic types,
19398 and in future change to <tt>ArithmeticLike</tt>.
19399 However, Alisdair believes this is not feasible.
19405 We look forward to proposed wording. Move to Open.
19410 2009-08-01 Howard adds:
19415 See commented dated 2009-08-01 in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#951">951</a>.
19419 <p><b>Proposed resolution:</b></p>
19428 <h3><a name="954"></a>954. Various threading bugs #4</h3>
19429 <p><b>Section:</b> 20.9.1 [time.clock.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
19430 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-08-01</p>
19431 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#time.clock.req">active issues</a> in [time.clock.req].</p>
19432 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.clock.req">issues</a> in [time.clock.req].</p>
19433 <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>
19434 <p><b>Discussion:</b></p>
19436 Table 55 -- Clock Requirements (in 20.9.1 [time.clock.req])
19441 the requirements for <tt>C1::time_point</tt> require <tt>C1</tt> and <tt>C2</tt>
19442 to "refer to the same epoch", but "epoch" is not defined.
19445 "Different clocks may share a <tt>time_point</tt> definition if it is
19446 valid to compare their <tt>time_point</tt>s by comparing their
19447 respective <tt>duration</tt>s." What does "valid" mean here? And, since
19448 <tt>C1::rep</tt> is "**THE** representation type of the native
19449 <tt>duration</tt> and <tt>time_point</tt>" (emphasis added), there
19450 doesn't seem to be much room for some other representation.
19453 <tt>C1::is_monotonic</tt> has type "<tt>const bool</tt>". The
19454 "<tt>const</tt>" should be removed.
19457 <tt>C1::period</tt> has type <tt>ratio</tt>. <tt>ratio</tt> isn't a type,
19458 it's a template. What is the required type?
19463 2009-05-10 Howard adds:
19470 "epoch" is purposefully not defined beyond the common English
19471 <a href="http://www.dictionary.net/epoch">definition</a>. The C standard
19472 also chose not to define epoch, though POSIX did. I believe it is a strength
19473 of the C standard that epoch is not defined. When it is known that two <tt>time_point</tt>s
19474 refer to the same epoch, then a definition of the epoch is not needed to compare
19475 the two <tt>time_point</tt>s, or subtract them.
19478 A <tt>time_point</tt> and a <tt>Clock</tt> implicitly refer to an (unspecified) epoch.
19479 The <tt>time_point</tt> represents an offset (<tt>duration</tt>) from an epoch.
19488 may share a <tt>time_point</tt>
19489 definition if it is valid to
19490 compare their <tt>time_point</tt>s by
19491 comparing their respective
19492 <tt>duration</tt>s.
19496 is redundant and could be removed. I believe the sentence which follows the above:
19500 <tt>C1</tt> and <tt>C2</tt> shall refer to the same epoch.
19504 is sufficient. If two clocks share the same epoch, then by definition, comparing
19505 their <tt>time_point</tt>s is valid.
19509 <tt>is_monotonic</tt> is meant to never change (be <tt>const</tt>). It is also
19510 desired that this value be usable in compile-time computation and branching.
19514 This should probably instead be worded:
19517 An instantiation of <tt>ratio</tt>.
19528 Re (a): It is not clear to us whether "epoch" is a term of art.
19531 Re (b), (c), and (d): We agree with Howard's comments,
19532 and would consider adding to (c) a <tt>static constexpr</tt> requirement.
19535 Move to Open pending proposed wording.
19540 2009-05-25 Daniel adds:
19545 In regards to (d) I suggest to say "a specialization of ratio" instead of
19546 "An instantiation of ratio". This seems to be the better matching standard
19547 core language term for this kind of entity.
19551 2009-05-25 Ganesh adds:
19557 Regarding (a), I found this paper on the ISO website using the term "epoch" consistently with the current wording:
19561 <a href="http://standards.iso.org/ittf/PubliclyAvailableStandards/C030811e_FILES/MAIN_C030811e/text/ISOIEC_18026E_TEMPORAL_CS.HTM">http://standards.iso.org/ittf/PubliclyAvailableStandards/C030811e_FILES/MAIN_C030811e/text/ISOIEC_18026E_TEMPORAL_CS.HTM</a>
19564 which is part of ISO/IEC 18026 "Information technology -- Spatial Reference Model (SRM)".
19569 2009-08-01 Howard: Moved to Reivew as the wording requested in Batavia has been provided.
19575 <p><b>Proposed resolution:</b></p>
19579 Change 20.9.1 [time.clock.req] p1:
19582 -1- A clock is a bundle consisting of a native <tt>duration</tt>, a native <tt>time_point</tt>, and a function <tt>now()</tt> to get the
19583 current <tt>time_point</tt>. <ins>The origin of the clock's <tt>time_point</tt> is referred to as the clock's <i>epoch</i> as defined in
19584 section 6.3 of ISO/IEC 18026.</ins>
19585 A clock shall meet the requirements in Table 45.
19590 Remove the sentence from the <tt>time_point</tt> row of the table "Clock Requirements":
19593 <caption>Clock requirements</caption>
19596 <tt>C1::time_point</tt>
19599 <tt>chrono::time_point<C1></tt> or <tt>chrono::time_point<C2, C1::duration></tt>
19602 The native <tt>time_point</tt> type of the clock.
19603 <del>Different clocks may share a <tt>time_point</tt> definition if it is valid to compare their <tt>time_point</tt>s by comparing their respective <tt>duration</tt>s.</del>
19604 <tt>C1</tt> and <tt>C2</tt> shall refer to the same epoch.
19610 <ol start="4" type="a">
19613 Change the row starting with <tt>C1::period</tt> of the table "Clock Requirements":
19616 <caption>Clock requirements</caption>
19619 <tt>C1::period</tt>
19622 <ins>a specialization of</ins> <tt>ratio</tt>
19625 The tick period of the clock in seconds.
19638 <h3><a name="955"></a>955. Various threading bugs #5</h3>
19639 <p><b>Section:</b> 20.9.1 [time.clock.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
19640 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-06-07</p>
19641 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#time.clock.req">active issues</a> in [time.clock.req].</p>
19642 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.clock.req">issues</a> in [time.clock.req].</p>
19643 <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>
19644 <p><b>Discussion:</b></p>
19646 20.9.1 [time.clock.req] requires that a clock type have a member
19647 typedef named <tt>time_point</tt> that names an instantiation of the
19648 template <tt>time_point</tt>, and a member named <tt>duration</tt> that
19649 names an instantiation of the template <tt>duration</tt>. This mixing of
19650 levels is confusing. The typedef names should be different from the
19655 Post Summit, Anthony provided proposed wording.
19660 2009-05-04 Howard adds:
19666 The reason that the typedef names were given the same name as the class templates
19667 was so that clients would not have to stop and think about whether they were
19668 using the clock's native <tt>time_point</tt> / <tt>duration</tt> or the class
19669 template directly. In this case, one person's confusion is another person's
19670 encapsulation. The detail that sometimes one is referring to the clock's
19671 native types, and sometimes one is referring to an independent type is
19672 <em>purposefully</em> "hidden" because it is supposed to be an unimportant
19673 detail. It can be confusing to have to remember when to type <tt>duration</tt>
19674 and when to type <tt>duration_type</tt>, and there is no need to require the
19675 client to remember something like that.
19679 For example, here is code that I once wrote in testing out the usability of
19683 <blockquote><pre>template <class Clock, class Duration>
19684 void do_until(const std::chrono::<b>time_point</b><Clock, Duration>& t)
19686 typename Clock::<b>time_point now</b> = Clock::now();
19689 typedef typename std::common_type
19692 typename std::chrono::system_clock::<b>duration</b>
19694 typedef std::chrono::<b>duration</b><double, std::nano> ID;
19697 ID us = duration_cast<ID>(d);
19703 </pre></blockquote>
19706 I see no rationale to require the client to append <tt>_type</tt> to <em>some</em>
19707 of those declarations. It seems overly burdensome on the author of <tt>do_until</tt>:
19710 <blockquote><pre>template <class Clock, class Duration>
19711 void do_until(const std::chrono::<b>time_point</b><Clock, Duration>& t)
19713 typename Clock::<b>time_point<font color="#c80000">_type</font></b> now = Clock::now();
19716 typedef typename std::common_type
19719 typename std::chrono::system_clock::<b>duration<font color="#c80000">_type</font></b>
19721 typedef std::chrono::<b>duration</b><double, std::nano> ID;
19724 ID us = duration_cast<ID>(d);
19730 </pre></blockquote>
19733 Additionally I'm fairly certain that this suggestion hasn't been implemented.
19734 If it had, it would have been discovered that it is incomplete. <tt>time_point</tt>
19735 also has a nested type (purposefully) named <tt>duration</tt>.
19738 That is, the current proposed wording would put the WP into an inconsistent state.
19742 the current WP has been implemented and I've received very favorable feedback
19743 from people using this interface in real-world code.
19754 Bill agrees that distinct names should be used for distinct kinds of entities.
19757 Walter would prefer not to suffix type names,
19758 especially for such well-understood terms as "duration".
19761 Howard reminds us that the proposed resolution is incomplete, per his comment
19770 2009-06-07 Howard adds:
19776 Not meaning to be argumentative, but we have a decade of positive experience
19777 with the precedent of using the same name for the nested type as an external
19778 class representing an identical concept.
19781 <blockquote><pre>template<class Category, class T, class Distance = ptrdiff_t,
19782 class Pointer = T*, class Reference = T&>
19783 struct <b>iterator</b>
19788 template <BidirectionalIterator Iter>
19789 class <b>reverse_iterator</b>
19794 template <ValueType T, Allocator Alloc = allocator<T> >
19795 requires NothrowDestructible<T>
19799 typedef <i>implementation-defined</i> <b>iterator</b>;
19801 typedef reverse_iterator<iterator> <b>reverse_iterator</b>;
19804 </pre></blockquote>
19807 I am aware of <em>zero</em> complaints regarding the use of <tt>iterator</tt>
19808 and <tt>reverse_iterator</tt> as nested types of the containers despite these
19809 names also having related meaning at namespace std scope.
19813 Would we really be doing programmers a favor by renaming these nested types?
19816 <blockquote><pre>template <ValueType T, Allocator Alloc = allocator<T> >
19817 requires NothrowDestructible<T>
19821 typedef <i>implementation-defined</i> <b>iterator_type</b>;
19823 typedef reverse_iterator<iterator> <b>reverse_iterator_type</b>;
19826 </pre></blockquote>
19829 I submit that such design contributes to needless verbosity which ends up
19830 reducing readability.
19836 <p><b>Proposed resolution:</b></p>
19838 Change 20.9 [time]:
19841 <blockquote><pre>...
19842 template <class Clock, class Duration = typename Clock::duration<ins>_type</ins>> class time_point;
19844 </pre></blockquote>
19847 Change 20.9.1 [time.clock.req]:
19852 <caption>Table 45 -- Clock requirements</caption>
19854 <th>Expression</th>
19855 <th>Return type</th>
19856 <th>Operational semantics</th>
19864 <td><tt>C1::duration<ins>_type</ins></tt></td>
19865 <td><tt>chrono::duration<C1::rep, C1::period></tt></td>
19866 <td>The native <tt>duration</tt> type of the clock.</td>
19869 <td><tt>C1::time_point<ins>_type</ins></tt></td>
19870 <td><tt>chrono::time_point<C1></tt> or <tt>chrono::time_point<C2, C1::duration<ins>_type</ins><</tt></td>
19871 <td>The native <tt>time_point</tt> type of the clock. Different clocks may share a <tt>time_point<ins>_type</ins></tt>
19872 definition if it is valid to
19873 compare their <tt>time_point<ins>_type</ins></tt>s by
19874 comparing their respective
19875 <tt>duration<ins>_type</ins></tt>s. <tt>C1</tt> and <tt>C2</tt> shall
19876 refer to the same epoch.</td>
19884 <td><tt>C1::now()</tt></td>
19885 <td><tt>C1::time_point<ins>_type</ins></tt></td>
19886 <td>Returns a <tt>time_point<ins>_type</ins></tt> object
19887 representing the current point
19895 Change 20.9.5.1 [time.clock.system]:
19900 -1- Objects of class <tt>system_clock</tt> represent wall clock time from the system-wide realtime clock.
19903 <blockquote><pre>class system_clock {
19905 typedef <i>see below</i> rep;
19906 typedef ratio<<i>unspecified</i>, <i>unspecified</i>> period;
19907 typedef chrono::duration<rep, period> duration<ins>_type</ins>;
19908 typedef chrono::time_point<system_clock> time_point<ins>_type</ins>;
19909 static const bool is_monotonic = <i>unspecified</i> ;
19911 static time_point<ins>_type</ins> now();
19914 static time_t to_time_t (const time_point<ins>_type</ins>& t);
19915 static time_point<ins>_type</ins> from_time_t(time_t t);
19917 </pre></blockquote>
19920 -2- <tt>system_clock::duration<ins>_type</ins>::min() < system_clock::duration<ins>_type</ins>::zero()</tt> shall be <tt>true</tt>.
19923 <pre>time_t to_time_t(const time_point<ins>_type</ins>& t);
19927 -3- <i>Returns:</i> A <tt>time_t</tt> object that represents the same
19928 point in time as <tt>t</tt> when both values are truncated to the
19929 coarser of the precisions of <tt>time_t</tt> and <tt>time_point<ins>_type</ins></tt>.
19932 <pre><tt>time_point<ins>_type</ins></tt> from_time_t(time_t t);
19936 -4- <i>Returns:</i> A <tt>time_point<ins>_type</ins></tt> object that represents the same point
19937 in time as <tt>t</tt> when both values are truncated to the coarser of the
19938 precisions of <tt>time_t</tt> and <tt>time_point<ins>_type</ins></tt>.
19943 Change 20.9.5.2 [time.clock.monotonic]:
19946 <blockquote><pre>class monotonic_clock {
19948 typedef <i>unspecified</i> rep;
19949 typedef ratio<<i>unspecified</i> , <i>unspecified</i>> period;
19950 typedef chrono::duration<rep, period> duration<ins>_type</ins>;
19951 typedef chrono::time_point<<i>unspecified</i> , duration<ins>_type</ins>> time_point<ins>_type</ins>;
19952 static const bool is_monotonic = true;
19954 static time_point<ins>_type</ins> now();
19956 </pre></blockquote>
19959 Change 20.9.5.3 [time.clock.hires]:
19962 <blockquote><pre>class high_resolution_clock {
19964 typedef <i>unspecified</i> rep;
19965 typedef ratio<<i>unspecified</i> , <i>unspecified</i>> period;
19966 typedef chrono::duration<rep, period> duration<ins>_type</ins>;
19967 typedef chrono::time_point<<i>unspecified</i> , duration<ins>_type</ins>> time_point<ins>_type</ins>;
19968 static const bool is_monotonic = true;
19970 static time_point<ins>_type</ins> now();
19972 </pre></blockquote>
19980 <h3><a name="956"></a>956. Various threading bugs #6</h3>
19981 <p><b>Section:</b> 20.9.1 [time.clock.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
19982 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-05-23</p>
19983 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#time.clock.req">active issues</a> in [time.clock.req].</p>
19984 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.clock.req">issues</a> in [time.clock.req].</p>
19985 <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>
19986 <p><b>Discussion:</b></p>
19988 20.9.1 [time.clock.req] uses the word "native" in several places,
19989 but doesn't define it. What is a "native <tt>duration</tt>"?
19993 2009-05-10 Howard adds:
19998 The standard uses "native" in several places without defining it (e.g.
19999 2.14.3 [lex.ccon]). It is meant to mean "that which is defined
20000 by the facility", or something along those lines. In this case it refers
20001 to the nested <tt>time_point</tt> and <tt>duration</tt> types of the clock.
20002 Better wording is welcome.
20010 Move to Open pending proposed wording from Pete.
20014 <p><b>Proposed resolution:</b></p>
20023 <h3><a name="957"></a>957. Various threading bugs #7</h3>
20024 <p><b>Section:</b> 20.9.5.1 [time.clock.system] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
20025 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-05-23</p>
20026 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.clock.system">issues</a> in [time.clock.system].</p>
20027 <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>
20028 <p><b>Discussion:</b></p>
20030 20.9.5.1 [time.clock.system]: <tt>to_time_t</tt> is overspecified. It
20031 requires truncation, but should allow rounding. For example, suppose a
20032 system has a clock that gives times in milliseconds, but <tt>time()</tt> rounds
20033 those times to the nearest second. Then <tt>system_clock</tt> can't use any
20034 resolution finer than one second, because if it did, truncating times
20035 between half a second and a full second would produce the wrong <tt>time_t</tt>
20040 Post Summit Anthony Williams provided proposed wording.
20049 Move to Review pending input from Howard. and other stakeholders.
20053 2009-05-23 Howard adds:
20058 I am in favor of the wording provided by Anthony.
20062 <p><b>Proposed resolution:</b></p>
20064 In 20.9.5.1 [time.clock.system] replace paragraphs 3 and 4 with:
20068 <pre>time_t to_time_t(const time_point& t);
20071 -3- <i>Returns:</i> A <tt>time_t</tt> object that represents the same
20072 point in time as <tt>t</tt> when both values are <del>truncated</del>
20073 <ins>restricted</ins> to the coarser of the precisions of
20074 <tt>time_t</tt> and <tt>time_point</tt>. <ins> It is implementation
20075 defined whether values are rounded or truncated to the required
20079 <pre>time_point from_time_t(time_t t);
20082 -4- <i>Returns:</i> A <tt>time_point</tt> object that represents the
20083 same point in time as <tt>t</tt> when both values are <del>truncated</del>
20084 <ins>restricted</ins> to the
20085 coarser of the precisions of <tt>time_t</tt> and <tt>time_point</tt>.
20086 <ins>It is implementation defined whether values are
20087 rounded or truncated to the required precision.</ins>
20096 <h3><a name="958"></a>958. Various threading bugs #8</h3>
20097 <p><b>Section:</b> 30.5.1 [thread.condition.condvar] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
20098 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-08-01</p>
20099 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.condition.condvar">active issues</a> in [thread.condition.condvar].</p>
20100 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.condition.condvar">issues</a> in [thread.condition.condvar].</p>
20101 <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>
20102 <p><b>Discussion:</b></p>
20104 30.5.1 [thread.condition.condvar]: the specification for <tt>wait_for</tt>
20105 with no predicate has an effects clause that says it calls <tt>wait_until</tt>,
20106 and a returns clause that sets out in words how to determine the return
20107 value. Is this description of the return value subtly different from the
20108 description of the value returned by <tt>wait_until</tt>? Or should the effects
20109 clause and the returns clause be merged?
20118 Move to open. Associate with LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> and any other monotonic-clock
20123 2009-08-01 Howard adds:
20128 I believe that <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> (currently Ready) addresses this issue, and
20129 that this issue should be marked NAD, solved by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> (assuming
20135 <p><b>Proposed resolution:</b></p>
20144 <h3><a name="959"></a>959. Various threading bugs #9</h3>
20145 <p><b>Section:</b> 30.5.1 [thread.condition.condvar] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
20146 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-08-01</p>
20147 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.condition.condvar">active issues</a> in [thread.condition.condvar].</p>
20148 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.condition.condvar">issues</a> in [thread.condition.condvar].</p>
20149 <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>
20150 <p><b>Discussion:</b></p>
20152 30.5.1 [thread.condition.condvar]: <tt>condition_variable::wait_for</tt>
20153 is required to compute the absolute time by adding the duration value to
20154 <tt>chrono::monotonic_clock::now()</tt>, but <tt>monotonic_clock</tt> is not required to
20164 Move to open. Associate with LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> and any other monotonic-clock
20169 2009-08-01 Howard adds:
20174 I believe that <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> (currently Ready) addresses this issue, and
20175 that this issue should be marked NAD, solved by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a> (assuming
20181 <p><b>Proposed resolution:</b></p>
20190 <h3><a name="960"></a>960. Various threading bugs #10</h3>
20191 <p><b>Section:</b> 30.4.1 [thread.mutex.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
20192 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-03-27</p>
20193 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.mutex.requirements">active issues</a> in [thread.mutex.requirements].</p>
20194 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.mutex.requirements">issues</a> in [thread.mutex.requirements].</p>
20195 <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>
20196 <p><b>Discussion:</b></p>
20198 30.4.1 [thread.mutex.requirements]: paragraph 4 is entitled
20199 "Error conditions", but according to 17.5.1.4 [structure.specifications], "Error
20200 conditions:" specifies "the error conditions for error codes reported by
20201 the function." It's not clear what this should mean when there is no
20215 Beman provided proposed wording.
20220 <p><b>Proposed resolution:</b></p>
20222 Change 30.4.1 [thread.mutex.requirements] Mutex requirements,
20223 paragraph 4 as indicated:
20228 -4- <del><i>Error conditions:</i></del>
20229 <ins>The error conditions for error codes, if any, reported by member
20230 functions of type Mutex shall be:</ins>
20234 <tt>not_enough_memory</tt> -- if there is not enough memory to construct
20238 <tt>resource_unavailable_try_again</tt> -- if any native handle type
20239 manipulated is not available.
20242 <tt>operation_not_permitted</tt> -- if the thread does not have the
20243 necessary permission to change the state of the mutex object.
20246 <tt>device_or_resource_busy</tt> -- if any native handle type
20247 manipulated is already locked.
20250 <tt>invalid_argument</tt> -- if any native handle type manipulated as
20251 part of mutex construction is incorrect.
20261 <h3><a name="961"></a>961. Various threading bugs #11</h3>
20262 <p><b>Section:</b> 30.4.1 [thread.mutex.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
20263 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-03-22</p>
20264 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.mutex.requirements">active issues</a> in [thread.mutex.requirements].</p>
20265 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.mutex.requirements">issues</a> in [thread.mutex.requirements].</p>
20266 <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>
20267 <p><b>Discussion:</b></p>
20269 30.4.1 [thread.mutex.requirements] describes required member
20270 functions of mutex types, and requires that they throw exceptions under
20271 certain circumstances. This is overspecified. User-defined types can
20272 abort on such errors without affecting the operation of templates
20273 supplied by standard-library.
20281 Move to open. Related to conceptualization and should probably be
20282 tackled as part of that.
20286 <p><b>Proposed resolution:</b></p>
20295 <h3><a name="962"></a>962. Various threading bugs #12</h3>
20296 <p><b>Section:</b> 30.4.3.2.2 [thread.lock.unique.locking] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
20297 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-07-21</p>
20298 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.lock.unique.locking">active issues</a> in [thread.lock.unique.locking].</p>
20299 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.lock.unique.locking">issues</a> in [thread.lock.unique.locking].</p>
20300 <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>
20301 <p><b>Discussion:</b></p>
20303 30.4.3.2.2 [thread.lock.unique.locking]: <tt>unique_lock::lock</tt> is
20304 required to throw an object of type <tt>std::system_error</tt> "when the
20305 postcondition cannot be achieved." The postcondition is <tt>owns == true</tt>,
20306 and this is trivial to achieve. Presumably, the requirement is intended
20307 to mean something more than that.
20319 Beman has volunteered to provide proposed wording.
20324 2009-07-21 Beman added wording to address 30.2.2 [thread.req.exception]
20325 in response to the Frankfurt notes in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a>.
20331 <p><b>Proposed resolution:</b></p>
20333 <p><i>Change Exceptions 30.2.2 [thread.req.exception] as indicated:</i></p>
20335 <p>Some functions described in this Clause are specified to throw exceptions of
20336 type <code>system_error</code> (19.5.5). Such exceptions shall be thrown if <ins>
20337 any of the <i>Error conditions</i> are detected or</ins> a call to an operating
20338 system or other underlying API results in an error that prevents the library
20339 function from <del>satisfying its postconditions or from returning a meaningful
20340 value</del> <ins>meeting its specifications</ins>. <ins>Nevertheless, failure to
20341 allocate storage shall be reported as described in [res.on.exception.handling].</ins></p>
20344 <p><i>Change thread assignment 30.3.1.4 [thread.thread.assign], join(),
20345 paragraph 8 as indicated:</i></p>
20347 <p><i>Throws:</i> <code>std::system_error</code> when <del>the postconditions cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20351 <p><i>Change thread assignment 30.3.1.4 [thread.thread.assign], detach(), paragraph
20352 13 as indicated:</i></p>
20355 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects or
20356 postconditions cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20360 <p><i>Change Mutex requirements 30.4.1 [thread.mutex.requirements], paragraph
20361 11, as indicated:</i></p>
20364 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects or
20365 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20367 <p><i>Change unique_lock locking 30.4.3.2.2 [thread.lock.unique.locking],
20368 paragraph 3, as indicated:</i></p>
20371 <p><i>Throws:</i> <code>std::system_error</code> when <del>the postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20373 <p><i>Change unique_lock locking 30.4.3.2.2 [thread.lock.unique.locking],
20374 paragraph 8, as indicated:</i></p>
20377 <p><i>Throws:</i> <code>std::system_error</code> when <del>the postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20379 <p><i>Change unique_lock locking 30.4.3.2.2 [thread.lock.unique.locking],
20380 paragraph 13, as indicated:</i></p>
20383 <p><i>Throws:</i> <code>std::system_error</code> when <del>the postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20385 <p><i>Change unique_lock locking 30.4.3.2.2 [thread.lock.unique.locking],
20386 paragraph 18, as indicated:</i></p>
20389 <p><i>Throws:</i> <code>std::system_error</code> when <del>the postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20391 <p><i>Change unique_lock locking 30.4.3.2.2 [thread.lock.unique.locking],
20392 paragraph 22, as indicated:</i></p>
20395 <p><i>Throws:</i> <code>std::system_error</code> when <del>the postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20397 <p><i>Change Function call_once 30.4.5.2 [thread.once.callonce], paragraph 4, as
20400 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>,
20401 or any exception thrown by <code>func</code>.</p>
20403 <p><i>Change Class condition_variable 30.5.1 [thread.condition.condvar],
20404 paragraph 12, as indicated:</i></p>
20407 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects or
20408 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20410 <p><i>Change Class condition_variable 30.5.1 [thread.condition.condvar],
20411 paragraph 19, as indicated:</i></p>
20414 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects or
20415 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20417 <p><i>Change Class condition_variable_any 30.5.2 [thread.condition.condvarany],
20418 paragraph 10, as indicated:</i></p>
20421 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects or
20422 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20424 <p><i>Change Class condition_variable_any 30.5.2 [thread.condition.condvarany],
20425 paragraph 16, as indicated:</i></p>
20428 <p><i>Throws:</i> <code>std::system_error</code> when <del>the returned value, effects, or
20429 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20432 <p><i>Assuming issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a>, Monotonic Clock is Conditionally Supported?, has been
20433 applied to the working paper, change Change 30.5.1 [thread.condition.condvar] as
20436 <pre>template <class Rep, class Period>
20437 bool wait_for(unique_lock<mutex>& lock,
20438 const chrono::duration<Rep, Period>& rel_time);</pre>
20441 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects or
20442 postcondition cannot be achieved</del> <ins>an exception is required ([thread.req.exception])</ins>.</p>
20445 <p><i>Assuming issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a>, Monotonic Clock is Conditionally Supported?, has been
20446 applied to the working paper, change Change 30.5.1 [thread.condition.condvar] as
20449 <pre>template <class Rep, class Period, class Predicate>
20450 bool wait_for(unique_lock<mutex>& lock,
20451 const chrono::duration<Rep, Period>& rel_time,
20452 Predicate pred);</pre>
20455 <p><i>Throws:</i> <code>std::system_error</code> when <del>the effects or
20456 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20459 <p><i>Assuming issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a>, Monotonic Clock is Conditionally Supported?, has been
20460 applied to the working paper, change 30.5.2 [thread.condition.condvarany] as
20463 <pre>template <class Lock, class Rep, class Period>
20464 bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time);</pre>
20467 <p><i>Throws:</i> <code>std::system_error</code> when <del>the returned value, effects or
20468 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20471 <p><i>Assuming issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#859">859</a>, Monotonic Clock is Conditionally Supported?, has been
20472 applied to the working paper, change 30.5.2 [thread.condition.condvarany] as
20475 <pre>template <class Lock, class Rep, class Period, class Predicate>
20476 bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred);</pre>
20479 <p><i>Throws:</i> <code>std::system_error</code> when <del>the returned value, effects or
20480 postcondition cannot be achieved</del> <ins>an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20489 <h3><a name="963"></a>963. Various threading bugs #13</h3>
20490 <p><b>Section:</b> 30.3.1.5 [thread.thread.member] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
20491 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-03-22</p>
20492 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.thread.member">active issues</a> in [thread.thread.member].</p>
20493 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.thread.member">issues</a> in [thread.thread.member].</p>
20494 <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>
20495 <p><b>Discussion:</b></p>
20497 30.3.1.5 [thread.thread.member]: <tt>thread::detach</tt> is required to
20498 throw an exception if the thread is "not a detachable thread".
20499 "Detachable" is never defined.
20508 Due to a mistake on my part, 3 proposed resolutions appeared at approximately
20509 the same time. They are all three noted below in the discussion.
20513 Summit, proposed resolution:
20519 In 30.3.1.5 [thread.thread.member] change:
20522 <blockquote><pre>void detach();
20526 <p>-14- <i>Error conditions:</i></p>
20528 <li><tt>no_such_process</tt> -- <ins>if the thread is</ins> not <del>a</del> valid<del> thread</del>.</li>
20529 <li><tt>invalid_argument</tt> -- <ins>if the thread is</ins> not <del>a detachable</del> <ins>joinable</ins><del> thread</del>.</li>
20538 Post Summit, Jonathan Wakely adds:
20544 A <tt>thread</tt> is detachable if it is joinable. As we've defined joinable,
20545 we can just use that.
20548 This corresponds to the pthreads specification, where pthread_detach
20549 fails if the thread is not joinable:
20552 EINVAL: The implementation has detected that the value specified by
20553 thread does not refer to a joinable thread.
20556 Jonathan recommends this proposed wording:
20560 In 30.3.1.5 [thread.thread.member] change:
20563 <blockquote><pre>void detach();
20567 <p>-14- <i>Error conditions:</i></p>
20570 <li><tt>invalid_argument</tt> -- not a <del>detachable</del> <ins>joinable</ins> thread.</li>
20579 Post Summit, Anthony Williams adds:
20585 This is covered by the precondition that <tt>joinable()</tt> be <tt>true</tt>.
20588 Anthony recommends this proposed wording:
20593 In 30.3.1.5 [thread.thread.member] change:
20596 <blockquote><pre>void detach();
20600 <p>-14- <i>Error conditions:</i></p>
20603 <li><del><tt>invalid_argument</tt> -- not a detachable thread.</del></li>
20615 <p><b>Proposed resolution:</b></p>
20622 <h3><a name="964"></a>964. Various threading bugs #14</h3>
20623 <p><b>Section:</b> 30.5.2 [thread.condition.condvarany] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
20624 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-03-22</p>
20625 <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>
20626 <p><b>Discussion:</b></p>
20628 The requirements for the constructor for <tt>condition_variable</tt> has several
20629 error conditions, but the requirements for the constructor for
20630 <tt>condition_variable_any</tt> has none. Is this difference intentional?
20639 Move to open, pass to Howard. If this is intentional, a note may be
20640 helpful. If the error conditions are to be copied from
20641 <tt>condition_variable</tt>, this depends on LWG <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#965">965</a>.
20645 Post Summit Howard adds:
20650 The original intention
20651 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2447.htm#ConditionVariablesWording">N2447</a>)
20652 was to let the OS return whatever errors it was going to return, and for
20653 those to be translated into exceptions, for both
20654 <tt>condition_variable</tt> and <tt>condition_variable_any</tt>. I have not
20655 received any complaints about specific error conditions from vendors on
20656 non-POSIX platforms, but such complaints would not surprise me if they surfaced.
20660 <p><b>Proposed resolution:</b></p>
20667 <h3><a name="966"></a>966. Various threading bugs #16</h3>
20668 <p><b>Section:</b> 30.5.1 [thread.condition.condvar] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
20669 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-08-01</p>
20670 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.condition.condvar">active issues</a> in [thread.condition.condvar].</p>
20671 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.condition.condvar">issues</a> in [thread.condition.condvar].</p>
20672 <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>
20673 <p><b>Discussion:</b></p>
20675 30.5.1 [thread.condition.condvar]: <tt>condition_variable::wait</tt> and
20676 <tt>condition_variable::wait_until</tt> both have a postcondition that <tt>lock</tt> is
20677 locked by the calling thread, and a throws clause that requires throwing
20678 an exception if this postcondition cannot be achieved. How can the
20679 implementation detect that this <tt>lock</tt> can never be obtained?
20688 Move to open. Requires wording. Agreed this is an issue, and the
20689 specification should not require detecting deadlocks.
20693 2009-08-01 Howard provides wording.
20699 The proposed wording is inspired by the POSIX spec which says:
20705 <dd>The value specified by cond or mutex is invalid.</dd>
20707 <dd>The mutex was not owned by the current thread at the time of the call.</dd>
20712 I do not believe [EINVAL] is possible without memory corruption (which we don't
20713 specify). [EPERM] is possible if this thread doesn't own the mutex, which is
20714 listed as a precondition. "May" is used instead of "Shall" because not all
20721 <p><b>Proposed resolution:</b></p>
20723 Change 30.5.1 [thread.condition.condvar] p12, p19 and
20724 30.5.2 [thread.condition.condvarany] p10, p16:
20728 <i>Throws:</i> <ins>May throw</ins> <tt>std::system_error</tt>
20730 if a precondition is not met.
20732 <del>when the effects or postcondition
20733 cannot be achieved.</del>
20741 <h3><a name="967"></a>967. Various threading bugs #17</h3>
20742 <p><b>Section:</b> 30.3.1.2 [thread.thread.constr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
20743 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-06-27</p>
20744 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.thread.constr">active issues</a> in [thread.thread.constr].</p>
20745 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.thread.constr">issues</a> in [thread.thread.constr].</p>
20746 <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>
20747 <p><b>Discussion:</b></p>
20749 the error handling for the constructor for <tt>condition_variable</tt>
20750 distinguishes lack of memory from lack of other resources, but the error
20751 handling for the thread constructor does not. Is this difference
20756 Beman has volunteered to provide proposed wording.
20761 <p><b>Proposed resolution:</b></p>
20762 <p><i>Change Exceptions 30.2.2 [thread.req.exception] as indicated:</i></p>
20764 <p>Some functions described in this Clause are
20765 specified to throw exceptions of type <code>system_error</code> (19.5.5). Such exceptions
20766 shall be thrown if any of the <i>Error conditions</i> are detected or a call to an operating system or other underlying API
20767 results in an error that prevents the library function from meeting its specifications.
20768 <ins><i>[Note:</i> See 17.6.4.10 [res.on.exception.handling] for exceptions thrown to report
20769 storage allocation failures. <i>--end
20770 note]</i></ins></p>
20774 <p><span style="font-style: italic;">Change Mutex requirements 30.4.1 [thread.mutex.requirements],
20775 paragraph 4, as indicated:</span></p>
20778 <p><i>Error conditions:</i></p>
20782 <li><del> <code>not_enough_memory</code> — if there is not enough memory to construct
20783 the mutex object.</del></li>
20785 <li><code>resource_unavailable_try_again</code> — if any native handle type
20786 manipulated is not available.</li>
20788 <li><code>operation_not_permitted</code> — if the thread does not have the
20789 necessary permission to change the state of the mutex object.</li>
20791 <li><code>device_or_resource_busy</code> — if any native handle type
20792 manipulated is already locked.</li>
20794 <li><code>invalid_argument</code> — if any native handle type manipulated as
20795 part of mutex construction is incorrect.</li>
20800 <p><span style="font-style: italic;">Change Class condition_variable 30.5.1 [thread.condition.condvar],
20801 default constructor, as indicated:</span></p>
20803 <p><code>condition_variable();</code></p>
20805 <p><i>Effects:</i> Constructs an object of type <code>condition_variable</code>.</p>
20806 <p><ins><i>Throws:</i> <code>std::system_error</code> when an exception is required (30.2.2 [thread.req.exception])</ins>.</p>
20807 <p><i>Error conditions:</i></p>
20810 <li><del><code>not_enough_memory</code> &msash; if a memory limitation prevents
20811 initialization.</del></li>
20812 <li> <code>resource_unavailable_try_again</code> &msash; if some non-memory
20813 resource limitation prevents initialization.</li>
20814 <li> <code>device_or_resource_busy</code> &msash; if attempting to initialize a
20815 previously-initialized but as of yet undestroyed <code>condition_variable</code>.</li>
20826 <h3><a name="968"></a>968. Various threading bugs #18</h3>
20827 <p><b>Section:</b> 30.4.1 [thread.mutex.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
20828 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2009-01-07 <b>Last modified:</b> 2009-06-27</p>
20829 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.mutex.requirements">active issues</a> in [thread.mutex.requirements].</p>
20830 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.mutex.requirements">issues</a> in [thread.mutex.requirements].</p>
20831 <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>
20832 <p><b>Discussion:</b></p>
20834 30.4.1 [thread.mutex.requirements]: several functions are
20835 required to throw exceptions "if the thread does not have the necessary
20836 permission ...". "The necessary permission" is not defined.
20849 Beman has volunteered to provide proposed wording.
20854 <p><b>Proposed resolution:</b></p>
20857 <p><i>Change Exceptions 30.2.2 [thread.req.exception] as indicated:</i></p>
20859 <p>Some functions described in this Clause are
20860 specified to throw exceptions of type <code>system_error</code> (19.5.5). Such exceptions
20861 shall be thrown if any of the <i>Error conditions</i> are detected or a call to an operating system or other underlying API
20862 results in an error that prevents the library function from meeting its specifications.
20863 <i>[Note:</i> See 17.6.4.10 [res.on.exception.handling] for exceptions thrown to report
20864 storage allocation failures. <i>—end
20867 <p><ins><i>[Example:</i></ins></p>
20871 <p><ins>A function in this clause that is specified to throw exceptions of type <code>
20872 system_error</code> and specifies <i>Error conditions</i> that include <code>
20873 operation_not_permitted</code> for a thread that does not have the privilege to
20874 perform the operation. During the execution of this function, an <code>errno</code>
20875 of <code>EPERM</code> is reported by a POSIX API call used by the
20876 implementation. Since POSIX specifies an <code>errno</code> of <code>EPERM</code>
20877 when "the caller does not have the privilege to perform the operation",
20878 the implementation maps <code>EPERM</code> to an <code>error_condition</code>
20879 of <code>operation_not_permitted</code> (19.5 [syserr]) and an exception of type <code>
20880 system_error</code> is thrown. </ins></p>
20884 <p><ins><i>—end example]</i></ins></p>
20886 <p><span style="font-style: italic;">Editorial note: For the sake of exposition,
20887 the existing text above is shown with the changes proposed in issues 962 and 967. The
20888 proposed additional example is independent of whether or not the 962 and 967
20889 proposed resolutions are accepted.</span></p>
20893 <p><span style="font-style: italic;">Change Mutex requirements 30.4.1 [thread.mutex.requirements],
20894 paragraph 4, as indicated:</span></p>
20898 <p>— <code>operation_not_permitted</code> — if the thread does not have the
20899 <del>necessary permission to change the state of the mutex object</del> <ins>privilege to perform the operation</ins>.</p>
20903 <p><span style="font-style: italic;">Change Mutex requirements 30.4.1 [thread.mutex.requirements],
20904 paragraph 12, as indicated:</span></p>
20908 <p>— <code>operation_not_permitted</code> — if the thread does not have the
20909 <del>necessary permission to change the state of the mutex</del> <ins>privilege to perform the operation</ins>.</p>
20919 <h3><a name="971"></a>971. Spurious diagnostic conversion function</h3>
20920 <p><b>Section:</b> 19.5.2.6 [syserr.errcode.nonmembers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD">Tentatively NAD</a>
20921 <b>Submitter:</b> Beman Dawes <b>Opened:</b> 2009-01-19 <b>Last modified:</b> 2009-07-22</p>
20922 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20NAD">Tentatively NAD</a> status.</p>
20923 <p><b>Discussion:</b></p>
20925 Anthony Williams raised the question in c++std-lib-22987 "why is there
20926 <tt>std::make_error_code(std::errc)</tt>? What purpose does this serve?"
20929 The function <tt>make_error_code(errc e)</tt> is not required, since
20930 <tt>make_error_condition(errc e)</tt> is the function that is needed for <tt>errc</tt>
20931 conversions. <tt>make_error_code(errc e)</tt> appears to be a holdover from my
20932 initial confusion over the distinction between POSIX and operating
20933 systems that conform to the POSIX spec.
20950 The designer of the facility (Christopher Kohlhoff)
20951 strongly disagrees that there is an issue here,
20952 and especially disagrees with the proposed resolution.
20953 Bill would prefer to be conservative and not apply this proposed resolution.
20954 Move to Open, and recommend strong consideration for NAD status.
20958 2009-05-21 Beman adds:
20963 My mistake. Christopher and Bill are correct and the issue should be
20964 NAD. The function is needed by users.
20968 2009-07-21 Christopher Kohlhoff adds rationale for <tt>make_error_code</tt>:
20974 Users (and indeed library implementers) may need to use the
20975 <tt>errc</tt> codes in portable code. For example:
20978 <blockquote><pre>void do_foo(error_code& ec)
20980 #if defined(_WIN32)
20981 // Windows implementation ...
20982 #elif defined(linux)
20983 // Linux implementation ...
20985 // do_foo not supported on this platform
20986 ec = make_error_code(errc::not_supported);
20989 </pre></blockquote>
20993 <p><b>Proposed resolution:</b></p>
20995 Change System error support 19.5 [syserr], Header <tt><system_error></tt>
20996 synopsis, as indicated:
20999 <blockquote><pre><del>error_code make_error_code(errc e);</del>
21000 error_condition make_error_condition(errc e);
21001 </pre></blockquote>
21004 Delete from Class error_code non-member functions
21005 19.5.2.6 [syserr.errcode.nonmembers]:
21008 <blockquote><pre><del>error_code make_error_code(errc e);</del>
21011 <del><i>Returns:</i> <tt>error_code(static_cast<int>(e),
21012 generic_category)</tt>.</del>
21022 <h3><a name="974"></a>974. <tt>duration<double></tt> should not implicitly convert to <tt>duration<int></tt></h3>
21023 <p><b>Section:</b> 20.9.3.1 [time.duration.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
21024 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-01-21 <b>Last modified:</b> 2009-08-01</p>
21025 <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>
21026 <p><b>Discussion:</b></p>
21028 The following code should not compile because it involves implicit truncation
21029 errors (against the design philosophy of the <tt>duration</tt> library).
21032 <blockquote><pre>duration<double> d(3.5);
21033 duration<int> i = d; <font color="#c80000">// implicit truncation, should not compile</font>
21034 </pre></blockquote>
21037 This intent was codified in the example implementation which drove this proposal
21038 but I failed to accurately translate the code into the specification in this
21048 We agree with the proposed resolution.
21051 Move to Tentatively Ready.
21061 Moved from Tentatively Ready to Open only because the wording needs to be
21062 improved for enable_if type constraining, possibly following Robert's
21067 2009-08-01 Howard adds:
21072 Addressed by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1177">1177</a>.
21077 <p><b>Proposed resolution:</b></p>
21079 Change 20.9.3.1 [time.duration.cons], p4:
21083 <pre>template <class Rep2, class Period2>
21084 duration(const duration<Rep2, Period2>& d);
21087 -4- <i>Requires:</i> <tt>treat_as_floating_point<rep>::value</tt>
21088 shall be <tt>true</tt> or <ins>both</ins> <tt>ratio_divide<Period2,
21089 period>::type::den</tt> shall be 1
21090 <ins>and <tt>treat_as_floating_point<Rep2>::value</tt>
21091 shall be <tt>false</tt></ins>.
21092 Diagnostic required.
21093 [<i>Note:</i> This requirement prevents implicit truncation error when
21094 converting between integral-based <tt>duration</tt> types. Such a
21095 construction could easily lead to confusion about the value of the
21096 <tt>duration</tt>. -- <i>end note</i>]
21105 <h3><a name="976"></a>976. Class template std::stack should be movable</h3>
21106 <p><b>Section:</b> 23.3.5.3.1 [stack.defn] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
21107 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2009-02-01 <b>Last modified:</b> 2009-07-14</p>
21108 <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>
21109 <p><b>Discussion:</b></p>
21111 The synopsis given in 23.3.5.3.1 [stack.defn] does not show up
21114 <blockquote><pre>requires MoveConstructible<Cont> stack(stack&&);
21115 requires MoveAssignable<Cont> stack& operator=(stack&&);
21116 </pre></blockquote>
21119 although the other container adaptors do provide corresponding
21129 We agree with the proposed resolution.
21132 Move to Tentatively Ready.
21142 Moved from Tentatively Ready to Open only because the wording needs to be
21143 tweaked for concepts removal.
21148 <p><b>Proposed resolution:</b></p>
21150 In the class stack synopsis of 23.3.5.3.1 [stack.defn] insert:
21153 <blockquote><pre>template <ObjectType T, StackLikeContainer Cont = deque<T> >
21154 requires SameType<Cont::value_type, T>
21155 && NothrowDestructible<Cont>
21159 requires CopyConstructible<Cont> explicit stack(const Cont&);
21160 requires MoveConstructible<Cont> explicit stack(Cont&& = Cont());
21161 <ins>requires MoveConstructible<Cont> stack(stack&&);</ins>
21162 <ins>requires MoveAssignable<Cont> stack& operator=(stack&&);</ins>
21163 template <class Alloc>
21164 requires Constructible<Cont, const Alloc&>
21165 explicit stack(const Alloc&);
21168 </pre></blockquote>
21171 [Remark: This change should be done in sync with the resolution of
21173 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2819.html">N2819</a>]
21182 <h3><a name="977"></a>977. insert iterators inefficient for expensive to move types</h3>
21183 <p><b>Section:</b> 24.7 [insert.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
21184 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-02-02 <b>Last modified:</b> 2009-05-23</p>
21185 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#insert.iterators">active issues</a> in [insert.iterators].</p>
21186 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#insert.iterators">issues</a> in [insert.iterators].</p>
21187 <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>
21188 <p><b>Discussion:</b></p>
21190 The new concepts for the insert iterators mandate an extra copy when
21191 inserting an lvalue:
21194 <blockquote><pre>requires CopyConstructible<Cont::value_type>
21195 back_insert_iterator<Cont>&
21196 operator=(const Cont::value_type& value);
21199 -1- <i>Effects:</i> <tt>push_back(*container, <b>Cont::value_type(</b>value<b>)</b>);</tt>
21204 The reason is to convert <tt>value</tt> into an rvalue because the current
21205 <tt>BackInsertionContainer</tt> concept only handles <tt>push_back</tt>-ing
21209 <blockquote><pre>concept BackInsertionContainer<typename C> : Container<C> {
21210 void push_back(C&, value_type&&);
21212 </pre></blockquote>
21215 Without the conversion of <tt>value</tt> to an rvalue, the assignment operator
21216 fails to concept check.
21220 A solution is to modify the <tt>BackInsertionContainer</tt> concept so that
21221 the client can pass in the parameter type for <tt>push_back</tt> similar to
21222 what is already done for the <tt>OutputIterator</tt> concept:
21225 <blockquote><pre>concept BackInsertionContainer<typename C, typename Value = C::value_type&&>
21226 : Container<C> {
21227 void push_back(C&, Value);
21229 </pre></blockquote>
21232 This allows the assignment operator to be adjusted appropriately:
21235 <blockquote><pre>requires BackInsertionContainer<Cont, Cont::value_type const&> &&
21236 CopyConstructible<Cont::value_type>
21237 back_insert_iterator<Cont>&
21238 operator=(const Cont::value_type& value);
21241 -1- <i>Effects:</i> <tt>push_back(*container, value);</tt>
21246 We may want to propagate this fix to other concepts such as <tt>StackLikeContainer</tt>.
21251 Solution and wording collaborated on by Doug and Howard.
21261 Howard notes that "these operations behaved efficiently until concepts were added."
21264 Alisdair is uncertain that the proposed resolution is syntactically correct.
21267 Move to Open, and recommend the issue be deferred until after the next
21268 Committee Draft is issued.
21273 <p><b>Proposed resolution:</b></p>
21275 Change 23.2.6.1 [container.concepts.free]:
21279 <pre>concept FrontInsertionContainer<typename C<ins>, typename Value = C::value_type&&</ins>>
21280 : Container<C> {
21281 void push_front(C&, <del>value_type&&</del> <ins>Value</ins>);
21283 axiom FrontInsertion(C c, <del>value_type</del> <ins>Value</ins> x) {
21284 x == (push_front(c, x), front(c));
21291 <pre>concept BackInsertionContainer<typename C<ins>, typename Value = C::value_type&&</ins>>
21292 : Container<C> {
21293 void push_back(C&, <del>value_type&&</del> <ins>Value</ins>);
21299 <pre>concept InsertionContainer<typename C<ins>, typename Value = C::value_type&&</ins>>
21300 : Container<C> {
21301 iterator insert(C&, const_iterator, <del>value_type&&</del> <ins>Value</ins>);
21303 axiom Insertion(C c, const_iterator position, <del>value_type</del> <ins>Value</ins> v) {
21304 v == *insert(c, position, v);
21312 Change 23.2.6.2 [container.concepts.member]:
21316 <pre>auto concept MemberFrontInsertionContainer<typename C<ins>, typename Value = C::value_type&&</ins>>
21317 : MemberContainer<C> {
21318 void C::push_front(<del>value_type&&</del> <ins>Value</ins>);
21320 axiom MemberFrontInsertion(C c, <del>value_type</del> <ins>Value</ins> x) {
21321 x == (c.push_front(x), c.front());
21328 <pre>auto concept MemberBackInsertionContainer<typename C<ins>, typename Value = C::value_type&&</ins>>
21329 : MemberContainer<C> {
21330 void C::push_back(<del>value_type&&</del> <ins>Value</ins>);
21336 <pre>auto concept MemberInsertionContainer<typename C<ins>, typename Value = C::value_type&&</ins>>
21337 : MemberContainer<C> {
21338 iterator C::insert(const_iterator, <del>value_type&&</del> <ins>Value</ins>);
21340 axiom MemberInsertion(C c, const_iterator position, <del>value_type</del> <ins>Value</ins> v) {
21341 v == *c.insert(position, v);
21348 Change 23.2.6.3 [container.concepts.maps]:
21352 <pre>template <MemberFrontInsertionContainer C<ins>, typename Value = C::value_type&&</ins>>
21353 concept_map FrontInsertionContainer<C<ins>, Value</ins>> {
21354 typedef Container<C>::value_type value_type;
21356 void push_front(C& c, <del>value_type&&</del> <ins>Value</ins> v) { c.push_front(static_cast<<del>value_type&&</del> <ins>Value</ins>>(v)); }
21362 <pre>template <MemberBackInsertionContainer C<ins>, typename Value = C::value_type&&</ins>>
21363 concept_map BackInsertionContainer<C<ins>, Value</ins>> {
21364 typedef Container<C>::value_type value_type;
21366 void push_back(C& c, <del>value_type&&</del> <ins>Value</ins> v) { c.push_back(static_cast<<del>value_type&&</del> <ins>Value</ins>>(v)); }
21372 <pre>template <MemberInsertionContainer C<ins>, typename Value = C::value_type&&</ins>>
21373 concept_map InsertionContainer<C<ins>, Value</ins>> {
21374 typedef Container<C>::value_type value_type;
21375 Container<C>::iterator insert(C& c, Container<C>::const_iterator i, <del>value_type&&</del> <ins>Value</ins> v)
21376 { return c.insert(i, static_cast<<del>value_type&&</del> <ins>Value</ins>>(v)); }
21383 Change 24.7.1 [back.insert.iterator]:
21386 <blockquote><pre>template <BackInsertionContainer Cont>
21387 class back_insert_iterator {
21389 requires <ins>BackInsertionContainer<Cont, const Cont::value_type&></ins>
21390 <del>CopyConstructible<Cont::value_type></del>
21391 back_insert_iterator<Cont>&
21392 operator=(const Cont::value_type& value);
21394 </pre></blockquote>
21397 Change 24.7.2.2 [back.insert.iter.op=]:
21401 <pre>requires <ins>BackInsertionContainer<Cont, const Cont::value_type&></ins>
21402 <del>CopyConstructible<Cont::value_type></del>
21403 back_insert_iterator<Cont>&
21404 operator=(const Cont::value_type& value);
21407 -1- <i>Effects:</i> <tt>push_back(*container, <del>Cont::value_type(</del>value<del>)</del>);</tt>
21412 Change 24.7.3 [front.insert.iterator]:
21415 <blockquote><pre>template <FrontInsertionContainer Cont>
21416 class front_insert_iterator {
21418 requires <ins>FrontInsertionContainer<Cont, const Cont::value_type&></ins>
21419 <del>CopyConstructible<Cont::value_type></del>
21420 front_insert_iterator<Cont>&
21421 operator=(const Cont::value_type& value);
21423 </pre></blockquote>
21426 Change 24.7.4.2 [front.insert.iter.op=]:
21430 <pre>requires <ins>FrontInsertionContainer<Cont, const Cont::value_type&></ins>
21431 <del>CopyConstructible<Cont::value_type></del>
21432 front_insert_iterator<Cont>&
21433 operator=(const Cont::value_type& value);
21436 -1- <i>Effects:</i> <tt>push_front(*container, <del>Cont::value_type(</del>value<del>)</del>);</tt>
21441 Change 24.7.5 [insert.iterator]:
21444 <blockquote><pre>template <InsertionContainer Cont>
21445 class insert_iterator {
21447 requires <ins>InsertionContainer<Cont, const Cont::value_type&></ins>
21448 <del>CopyConstructible<Cont::value_type></del>
21449 insert_iterator<Cont>&
21450 operator=(const Cont::value_type& value);
21452 </pre></blockquote>
21455 Change 24.7.6.2 [insert.iter.op=]:
21459 <pre>requires <ins>InsertionContainer<Cont, const Cont::value_type&></ins>
21460 <del>CopyConstructible<Cont::value_type></del>
21461 insert_iterator<Cont>&
21462 operator=(const Cont::value_type& value);
21466 -1- <i>Effects:</i>
21468 <blockquote><pre>iter = insert(*container, iter, <del>Cont::value_type(</del>value<del>)</del>);
21470 </pre></blockquote>
21480 <h3><a name="978"></a>978. Hashing smart pointers</h3>
21481 <p><b>Section:</b> 20.7.17 [unord.hash] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
21482 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-02-02 <b>Last modified:</b> 2009-07-28</p>
21483 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unord.hash">active issues</a> in [unord.hash].</p>
21484 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unord.hash">issues</a> in [unord.hash].</p>
21485 <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>
21486 <p><b>Discussion:</b></p>
21488 I don't see an open issue on supporting <tt>std::hash</tt> for smart pointers
21489 (<tt>unique_ptr</tt> and <tt>shared_ptr</tt> at least).
21492 It seems reasonable to at least expect support for the smart
21493 pointers, especially as they support comparison for use in ordered
21494 associative containers.
21503 Howard points out that the client can always supply a custom hash function.
21506 Alisdair replies that the smart pointer classes are highly likely
21507 to be frequently used as hash keys.
21510 Bill would prefer to be conservative.
21513 Alisdair mentions that this issue may also be viewed as a subissue or
21514 duplicate of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1025">1025</a>.
21517 Move to Open, and recommend the issue be deferred until after the next
21518 Committee Draft is issued.
21523 2009-05-31 Peter adds:
21529 Howard points out that the client can always supply a custom hash function.
21532 Not entirely true. The client cannot supply the function that hashes the
21533 address of the control block (the equivalent of the old <tt>operator<</tt>, now
21534 proudly carrying the awkward name of '<tt>owner_before</tt>'). Only the
21535 implementation can do that, not necessarily via specializing <tt>hash<></tt>, of
21539 This hash function makes sense in certain situations for <tt>shared_ptr</tt>
21540 (when one needs to switch from <tt>set/map</tt> using ownership ordering to
21541 <tt>unordered_set/map</tt>) and is the only hash function that makes sense for
21547 2009-07-28 Alisdair provides wording.
21553 <p><b>Proposed resolution:</b></p>
21555 Add the following declarations to the synopsis of <tt><memory></tt>
21559 <blockquote><pre>// 20.8.10.X hash support
21560 template <class T> struct hash;
21561 template <class T, class D> struct hash<unique_ptr<T,D>>;
21562 template <class T> struct hash<shared_ptr<T>>;
21563 </pre></blockquote>
21566 Add a new subclause 20.8.10.X hash support
21571 20.8.10.X hash support [util.smartptr.hash]
21574 <pre>template <class T, class D> struct hash<unique_ptr<T,D>>;
21578 A partial specialization of the class template <tt>hash</tt> (20.7.17 [unord.hash]) shall be provided for instances of the
21579 <tt>unique_ptr</tt> template suitable for use as a key in unordered
21580 associative containers (23.5 [unord]) if and only if there is a
21581 <tt>hash</tt> specialization available for the type <tt>D::pointer</tt>.
21582 For an object <tt>p</tt> of type <tt>unqiue_ptr<T,D></tt> the
21583 <tt>hash</tt> shall evaluate to the same value as <tt>hash<typename
21584 D::pointer>{}(p.get())</tt>.
21587 <pre>template <class T> struct hash<shared_ptr<T>>;
21591 A partial specialization of the class template <tt>hash</tt> (20.7.17 [unord.hash])
21592 shall be provided for instances of the <tt>shared_ptr</tt> template
21593 suitable for use as a key in unordered associative containers
21594 (23.5 [unord]). For an object <tt>p</tt> of type <tt>shared_ptr<T></tt>
21595 the <tt>hash</tt> shall evaluate
21596 to the same value as <tt>hash<T*>{}(p.get())</tt>.
21605 <h3><a name="983"></a>983. <tt>unique_ptr</tt> reference deleters should not be moved from</h3>
21606 <p><b>Section:</b> 20.8.9.2 [unique.ptr.single] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
21607 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-02-10 <b>Last modified:</b> 2009-05-23</p>
21608 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unique.ptr.single">active issues</a> in [unique.ptr.single].</p>
21609 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unique.ptr.single">issues</a> in [unique.ptr.single].</p>
21610 <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>
21611 <p><b>Discussion:</b></p>
21613 Dave brought to my attention that when a <tt>unique_ptr</tt> has a non-const reference
21614 type deleter, move constructing from it, even when the <tt>unique_ptr</tt> containing
21615 the reference is an rvalue, could have surprising results:
21618 <blockquote><pre>D d(some-state);
21619 unique_ptr<A, D&> p(new A, d);
21620 unique_ptr<A, D> p2 = std::move(p);
21621 <font color="#c80000">// has d's state changed here?</font>
21622 </pre></blockquote>
21625 I agree with him. It is the <tt>unique_ptr</tt> that is the rvalue, not the
21626 deleter. When the deleter is a reference type, the <tt>unique_ptr</tt> should
21627 respect the "lvalueness" of the deleter.
21639 Seems correct, but complicated enough that we recommend moving to Review.
21643 <p><b>Proposed resolution:</b></p>
21645 Change 20.8.9.2.1 [unique.ptr.single.ctor], p20-21
21649 <pre>template <class U, class E> unique_ptr(unique_ptr<U, E>&& u);
21655 -20- <i>Requires:</i> If <tt><del>D</del> <ins>E</ins></tt> is not a reference type,
21656 construction of the deleter <tt>D</tt> from an rvalue of type <tt>E</tt>
21657 shall be well formed and shall not throw an exception.
21659 Otherwise <tt>E</tt> is a reference type and construction of the deleter
21660 <tt>D</tt> from an lvalue of type <tt>E</tt> shall be well formed and
21661 shall not throw an exception.
21664 a reference type, then <tt>E</tt> shall be the same type as <tt>D</tt>
21665 (diagnostic required). <tt>unique_ptr<U, E>::pointer</tt> shall be
21666 implicitly convertible to <tt>pointer</tt>. [<tt>Note:</tt> These
21667 requirements imply that <tt>T</tt> and <tt>U</tt> are complete types.
21668 <i>-- end note</i>]
21672 -21- <i>Effects:</i> Constructs a <tt>unique_ptr</tt> which owns the
21673 pointer which <tt>u</tt> owns (if any). If the deleter
21674 <ins><tt>E</tt></ins> is not a reference type, <del>it</del> <ins>this
21675 deleter</ins> is move constructed from <tt>u</tt>'s deleter, otherwise
21676 <del>the reference</del> <ins>this deleter</ins> is copy constructed
21677 from <tt>u</tt>.'s deleter. After the construction, <tt>u</tt> no longer
21678 owns a pointer. [<i>Note:</i> The deleter constructor can be implemented
21679 with <tt>std::forward<<del>D</del><ins>E</ins>></tt>. <i>-- end
21687 Change 20.8.9.2.3 [unique.ptr.single.asgn], p1-3
21691 <pre>unique_ptr& operator=(unique_ptr&& u);
21696 -1- <i>Requires:</i> <ins>If the deleter <tt>D</tt> is not a reference type,</ins>
21697 <del>A</del><ins>a</ins>ssignment of the deleter <tt>D</tt> from an rvalue <tt>D</tt> shall not throw an exception.
21699 Otherwise the deleter <tt>D</tt> is a reference type,
21700 and assignment of the deleter <tt>D</tt> from an lvalue <tt>D</tt> shall not throw an exception.</ins>
21704 -2- <i>Effects:</i> reset(u.release()) followed by
21705 a<ins>n</ins> <del>move</del> assignment from <del><tt>u</tt>'s deleter to this deleter</del>
21706 <ins><tt>std::forward<D>(u.get_deleter())</tt></ins>.
21710 -3- <i>Postconditions:</i> This <tt>unique_ptr</tt> now owns the pointer
21711 which <tt>u</tt> owned, and <tt>u</tt> no longer owns it. <del>[<i>Note:</i> If
21712 <tt>D</tt> is a reference type, then the referenced lvalue deleters are
21713 move assigned. <i>-- end note</i>]</del>
21719 Change 20.8.9.2.3 [unique.ptr.single.asgn], p6-7
21723 <pre>template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u);
21728 <i>Requires:</i> <ins>If the deleter <tt>E</tt> is not a reference type,</ins>
21729 <del>A</del><ins>a</ins>ssignment of the deleter <tt>D</tt> from an rvalue
21730 <tt><del>D</del><ins>E</ins></tt> shall not throw an exception.
21732 Otherwise the deleter <tt>E</tt> is a reference type,
21733 and assignment of the deleter <tt>D</tt> from an lvalue <tt>E</tt> shall not throw an exception.</ins>
21734 <tt>unique_ptr<U, E>::pointer</tt> shall be implicitly convertible to <tt>pointer</tt>.
21735 [<i>Note:</i> These requirements imply that <tt>T</tt> and <tt>U></tt>
21736 are complete types. <i>-- end note</i>]
21740 <i>Effects:</i> <tt>reset(u.release())</tt> followed by
21741 a<ins>n</ins> <del>move</del> assignment from <del><tt>u</tt>'s deleter to this deleter</del>
21742 <ins><tt>std::forward<E>(u.get_deleter())</tt></ins>.
21744 <tt>D</tt> or <tt>E</tt> is a reference type, then the referenced lvalue
21745 deleter participates in the move assignment.</del>
21757 <h3><a name="985"></a>985. Allowing throwing move</h3>
21758 <p><b>Section:</b> 23.2.1 [container.requirements.general] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
21759 <b>Submitter:</b> Rani Sharoni <b>Opened:</b> 2009-02-12 <b>Last modified:</b> 2009-05-23</p>
21760 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements.general">active issues</a> in [container.requirements.general].</p>
21761 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements.general">issues</a> in [container.requirements.general].</p>
21762 <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>
21763 <p><b>Discussion:</b></p>
21765 <b>Introduction</b>
21768 <p>This proposal is meant to resolve potential regression of the
21769 <a href="" ref="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2800.pdf">N2800</a>
21771 next section, and to relax the requirements for containers of types with
21772 throwing move constructors.</p>
21774 <p>The basic problem is that some containers operations, like <tt>push_back</tt>,
21775 have a strong exception safety
21776 guarantee (i.e. no side effects upon exception) that are not achievable when
21777 throwing move constructors are used since there is no way to guarantee revert
21778 after partial move. For such operations the implementation can at most provide
21779 the basic guarantee (i.e. valid but unpredictable) as it does with multi
21780 copying operations (e.g. range insert).</p>
21782 <p>For example, <tt>vector<T>::push_back()</tt> (where <tt>T</tt> has a move
21783 constructor) might resize the <tt>vector</tt> and move the objects to the new underlying
21784 buffer. If move constructor throws it might
21785 not be possible to recover the throwing object or to move the old objects back to
21786 the original buffer.</p>
21788 <p>The current draft is explicit by disallowing throwing move
21789 for some operations (e.g. <tt>vector<>::reserve</tt>) and not clear about other
21790 operations mentioned in 23.2.1 [container.requirements.general]/10
21791 (e.g. single element <tt>insert</tt>): it guarantees strong exception
21792 safety without explicitly disallowing a throwing move constructor.
21799 <p>This section only refers to cases in which the contained object
21800 is by itself a standard container.</p>
21802 <p>Move constructors of standard containers are allowed to throw and therefore
21803 existing operations are broken, compared with C++03, due to move optimization.
21804 (In fact existing implementations like Dinkumware are actually throwing).</p>
21806 <p>For example, <tt>vector< list<int> >::reserve</tt> yields
21807 undefined behavior since <tt>list<int></tt>'s move constructor is allowed to throw.
21808 On the other hand, the same operation has strong exception safety guarantee in
21811 <p>There are few options to solve this regression:</p>
21815 Disallow throwing move and throwing default constructor
21819 Disallow throwing move but disallowing usage after move
21827 Disallow throwing move and making it optional
21832 <p>Option 1 is suggested by proposal
21833 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2815.html">N2815</a>
21834 but it might not be applicable for existing implementations for which
21835 containers default constructors are throwing.</p>
21837 <p>Option 2 limits the usage significantly and it's error prone
21838 by allowing zombie objects that are nothing but destructible (e.g. no <tt>clear()</tt>
21839 is allowed after move). It also potentially complicates the implementation by
21840 introducing special state.</p>
21842 <p>Option 3 is possible, for example, using default
21843 construction and <tt>swap</tt> instead of move for standard containers case. The
21844 implementation is also free to provide special hidden operation for non
21845 throwing move without forcing the user the cope with the limitation of option-2
21846 when using the public move.</p>
21848 <p>Option 4 impact the efficiency in all use cases due to rare throwing move.</p>
21850 <p>The proposed wording will imply option 1 or 3 though option 2 is also
21851 achievable using more wording. I personally oppose to option 2 that has impact
21855 <b>Relaxation for user types</b>
21858 <p>Disallowing throwing move constructors in general seems very restrictive
21859 since, for example, common implementation of move will be default construction
21860 + <tt>swap</tt> so move will throw if the
21861 default constructor will throw. This is currently the case with the Dinkumware
21862 implementation of node based containers (e.g. <tt>std::list</tt>)
21863 though this section doesn't refer to standard types.</p>
21865 <p>For throwing move constructors it seem that the implementation should have
21866 no problems to provide the basic guarantee instead of the strong one. It's
21867 better to allow throwing move constructors with basic guarantee than to
21868 disallow it silently (compile and run), via undefined behavior.</p>
21870 <p>There might still be cases in which the relaxation will break existing generic
21871 code that assumes the strong guarantee but it's broken either way given a
21872 throwing move constructor since this is not a preserving optimization. </p>
21880 Bjarne comments (referring to his draft paper):
21881 "I believe that my suggestion simply solves that.
21882 Thus, we don't need a throwing move."
21885 Move to Open and recommend it be deferred until after the next
21886 Committee Draft is issued.
21891 <p><b>Proposed resolution:</b></p>
21894 23.2.1 [container.requirements.general] paragraph 10 add footnote:
21899 -10- Unless otherwise specified (see 23.1.4.1, 23.1.5.1, 23.2.2.3, and
21900 23.2.6.4) all container types defined in this Clause meet the following
21901 additional requirements:
21908 <ins>[<i>Note</i>: for compatibility with C++
21909 2003, when "no effect" is required, standard containers should not use the
21910 value_type's throwing move constructor when the contained object is by itself a
21911 standard container. -- <i>end note</i>]</ins>
21916 <p>23.2.5.1 [unord.req.except] change paragraph 2 to say: </p>
21920 -2- For unordered associative containers, if an exception is
21921 thrown by any operation other than the container's hash function from within an
21922 <tt>insert()</tt> function inserting a single element, the <tt>insert()</tt>
21923 function has no effect<ins> unless the exception is thrown by the contained
21924 object move constructor</ins>.
21928 -4- For unordered associative containers, if an exception is
21929 thrown from within a <tt>rehash()</tt> function other than by the container's hash
21930 function or comparison function, the <tt>rehash()</tt> function has no effect
21931 <ins>unless the exception is thrown by the contained
21932 object move constructor</ins>.</p>
21937 23.3.2.3 [deque.modifiers] change paragraph 2 to say:
21941 -2- <i>Remarks:</i> If an exception is thrown other than by
21942 the copy constructor<ins>, move constructor</ins>
21943 or assignment operator of <tt>T</tt>
21944 there are no effects.
21945 <ins>If an exception is thrown by <tt>push_back()</tt> or <tt>emplace_back()</tt>
21946 function, that function has no effects unless the exception is thrown by
21947 the move constructor of <tt>T</tt>.</ins>
21951 23.3.2.3 [deque.modifiers] change paragraph 6 to say:
21955 -6- <i>Throws:</i> Nothing unless an exception is thrown by the copy
21956 constructor<ins>, move constructor</ins> or assignment operator of <tt>T</tt>.
21960 23.3.6.2 [vector.capacity] remove paragraph 2
21964 <del>-2- <i>Requires:</i> If <tt>value_type</tt> has a move constructor,
21965 that constructor shall not throw any exceptions.</del>
21969 23.3.6.2 [vector.capacity] paragraph 3 change to say:
21973 -3- <i>Effects:</i> A directive that informs a <tt>vector</tt>
21974 of a planned change in size, so
21975 that it can manage the storage allocation accordingly. After <tt>reserve()</tt>,
21976 <tt>capacity()</tt> is greater or equal to the argument of <tt>reserve</tt>
21977 if reallocation happens; and equal
21978 to the previous value of <tt>capacity()</tt>
21979 otherwise. Reallocation happens at this point if and only if the current
21980 capacity is less than the argument of <tt>reserve()</tt>.
21981 If an exception is thrown, there are no effects<ins>
21982 unless the exception is thrown by the contained object move constructor</ins>.
21986 23.3.6.2 [vector.capacity] paragraph 12 change to say:
21990 -12- <i>Requires:</i> <del>If <tt>value_type</tt> has a move constructor,
21991 that constructor shall not throw any exceptions.</del>
21992 <ins>If an exception is thrown, there are no effects unless the exception is thrown by
21993 the contained object move constructor.</ins>
21997 23.3.6.4 [vector.modifiers] change paragraph 1 to say:
22001 -1- <del><i>Requires:</i> If <tt>value_type</tt> has a move constructor,
22002 that constructor shall not throw any exceptions.</del>
22003 <ins><i>Remarks:</i> If an exception is thrown by <tt>push_back()</tt>
22004 or <tt>emplace_back()</tt> function, that function has no effect unless the
22005 exception is thrown by the move constructor of <tt>T</tt>.</ins>
22009 23.3.6.4 [vector.modifiers] change paragraph 2 to say:
22013 -2- <i>Remarks:</i> Causes reallocation if the new size is greater than
22014 the old capacity. If no reallocation happens, all the iterators and
22015 references before the insertion point remain valid. If an exception is
22016 thrown other than by the copy constructor<ins>, move constructor</ins>
22017 or assignment operator of <tt>T</tt> or by any <tt>InputIterator</tt>
22018 operation there are no effects.
22022 23.3.6.4 [vector.modifiers] change paragraph 6 to say:
22026 -6- <i>Throws:</i> Nothing unless an exception is thrown by the copy
22027 constructor<ins>, move constructor</ins> or assignment operator of <tt>T</tt>.
22036 <h3><a name="987"></a>987. <tt>reference_wrapper</tt> and function types</h3>
22037 <p><b>Section:</b> 20.7.5 [refwrap] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22038 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-02-18 <b>Last modified:</b> 2009-07-14</p>
22039 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#refwrap">issues</a> in [refwrap].</p>
22040 <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>
22041 <p><b>Discussion:</b></p>
22043 The synopsis in 20.7.5 [refwrap] says:
22046 <blockquote><pre>template <<b>ObjectType</b> T> class reference_wrapper
22048 </pre></blockquote>
22051 And then paragraph 3 says:
22056 The template instantiation <tt>reference_wrapper<T></tt> shall be
22057 derived from <tt>std::unary_function<T1, R></tt> only if the type
22058 <tt>T</tt> is any of the following:
22063 a <b>function type</b> or a pointer to function type taking one argument of
22064 type <tt>T1</tt> and returning <tt>R</tt>
22070 But function types are not <tt>ObjectType</tt>s.
22074 Paragraph 4 contains the same contradiction.
22084 Jens: restricted reference to ObjectType
22092 Post Summit, Peter adds:
22098 In <a href="https://svn.boost.org/trac/boost/ticket/1846">https://svn.boost.org/trac/boost/ticket/1846</a>
22099 however Eric Niebler makes the very reasonable point that <tt>reference_wrapper<F></tt>,
22100 where <tt>F</tt> is a function type, represents a reference to a function,
22101 a legitimate entity. So <tt>boost::ref</tt> was changed to allow it.
22104 <a href="https://svn.boost.org/trac/boost/browser/trunk/libs/bind/test/ref_fn_test.cpp">https://svn.boost.org/trac/boost/browser/trunk/libs/bind/test/ref_fn_test.cpp</a>
22107 Therefore, I believe an alternative proposed resolution for issue 987 could simply
22108 allow <tt>reference_wrapper</tt> to be used with function types.
22113 Post Summit, Howard adds:
22119 I agree with Peter (and Eric). I got this one wrong on my first try. Here
22120 is code that demonstrates how easy (and useful) it is to instantiate
22121 <tt>reference_wrapper</tt> with a function type:
22124 <blockquote><pre>#include <functional>
22126 template <class F>
22135 </pre></blockquote>
22138 Output (link time error shows type of <tt>reference_wrapper</tt> instantiated
22139 with function type):
22142 <blockquote><pre>Undefined symbols:
22143 "void test<std::reference_wrapper<void ()()> >(std::reference_wrapper<void ()()>)",...
22144 </pre></blockquote>
22147 I've taken the liberty of changing the proposed wording to allow function types
22148 and set to Open. I'll also freely admit that I'm not positive <tt>ReferentType</tt>
22149 is the correct concept.
22162 Howard observed that <tt>FunctionType</tt>,
22163 a concept not (yet?) in the Working Paper,
22164 is likely the correct constraint to be applied.
22165 However, the proposed resolution provides an adequate approximation.
22173 2009-05-23 Alisdair adds:
22179 By constraining to <tt>PointeeType</tt> we rule out the ability for <tt>T</tt> to be a
22180 reference, and call in reference-collapsing. I'm not sure if this is
22181 correct and intended, but would like to be sure the case was considered.
22184 Is dis-allowing reference types and the
22185 implied reference collapsing the intended result?
22195 Moved from Review to Open only because the wording needs to be
22196 tweaked for concepts removal.
22201 <p><b>Proposed resolution:</b></p>
22203 Change the synopsis in 20.7 [function.objects]:
22206 <blockquote><pre>// 20.6.5, reference_wrapper:
22207 template <<del>ObjectType</del> <ins>ReferentType</ins> T>
22208 <ins>requires PointeeType<T></ins>
22209 class reference_wrapper;
22211 template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22212 reference_wrapper<T> ref(T&);
22214 template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22215 reference_wrapper<const T> cref(const T&);
22217 template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22218 reference_wrapper<T> ref(reference_wrapper<T>);
22219 template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22220 reference_wrapper<const T> cref(reference_wrapper<T>);
22221 </pre></blockquote>
22224 Change the synopsis in 20.7.5 [refwrap]:
22227 <blockquote><pre>template <<del>ObjectType</del> <ins>ReferentType</ins> T>
22228 <ins>requires PointeeType<T></ins>
22229 class reference_wrapper
22231 </pre></blockquote>
22234 Change the prototypes in 20.7.5.5 [refwrap.helpers]:
22237 <blockquote><pre>template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22238 reference_wrapper<T> ref(T&);
22240 template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22241 reference_wrapper<const T> cref(const T&);
22243 template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22244 reference_wrapper<T> ref(reference_wrapper<T>);
22246 template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22247 reference_wrapper<const T> cref(reference_wrapper<T>);
22248 </pre></blockquote>
22252 <p><b>Rationale:</b></p>
22254 a) The occurrence of <tt>T&</tt> in the function signature auto-implies
22255 <tt>std::ReferentType</tt>,
22256 this is due to 14.11.1.2 [temp.req.impl]/4 bullet 4
22259 b) The occurrence of the constrained template <tt>reference_wrapper<T></tt> in
22261 signatures lets kick in 14.11.1.2 [temp.req.impl]/4 bullet 1 and adds *all* requirements of
22262 this template. But we need to add at least *one* requirement (and it
22264 but natural decision to require <tt>std::PointeeType</tt> here) to *activate*
22265 this. If we hadn't done
22266 this, we were in unconstrained mode!
22274 <h3><a name="996"></a>996. Move operation not well specified</h3>
22275 <p><b>Section:</b> 17 [library] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22276 <b>Submitter:</b> David Abrahams <b>Opened:</b> 2009-03-06 <b>Last modified:</b> 2009-05-23</p>
22277 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#library">active issues</a> in [library].</p>
22278 <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>
22279 <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>
22280 <p><b>Discussion:</b></p>
22282 There are lots of places in the standard where we talk about "the move
22283 constructor" but where we mean "the move operation," i.e. <tt>T( move( x ) )</tt>.
22286 We also don't account for whether that operation modifies <tt>x</tt> or not, and
22295 Move to Open, pending proposed wording from Dave for further
22300 <p><b>Proposed resolution:</b></p>
22309 <h3><a name="999"></a>999. Taking the address of a function</h3>
22310 <p><b>Section:</b> 20.8.8.1 [object.addressof] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22311 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2009-03-09 <b>Last modified:</b> 2009-07-14</p>
22312 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#object.addressof">issues</a> in [object.addressof].</p>
22313 <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>
22314 <p><b>Discussion:</b></p>
22316 The same fix (reference <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#987">987</a>) may be applied to <tt>addressof</tt>, which is also constrained to
22317 <tt>ObjectType</tt>. (That was why <tt>boost::ref</tt> didn't work with functions - it
22318 tried to apply <tt>boost::addressof</tt> and the <tt>reinterpret_cast<char&></tt>
22319 implementation of <tt>addressof</tt> failed.)
22333 Move to Tentatively Ready.
22343 Moved from Tentatively Ready to Open only because the wording needs to be
22344 tweaked for concepts removal.
22349 <p><b>Proposed resolution:</b></p>
22351 Change the synopsis in 20.8 [memory]:
22354 <blockquote><pre>template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22355 T* addressof(T& r);
22356 </pre></blockquote>
22359 Change 20.8.8.1 [object.addressof]:
22362 <blockquote><pre>template <<del>ObjectType</del> <ins>PointeeType</ins> T>
22363 T* addressof(T& r);
22364 </pre></blockquote>
22367 <p><b>Rationale:</b></p>
22369 a) The occurrence of <tt>T&</tt> in the function signature auto-implies
22370 <tt>std::ReferentType</tt>,
22371 this is due to 14.11.1.2 [temp.req.impl]/4 bullet 4
22379 <h3><a name="1004"></a>1004. Response to UK 179</h3>
22380 <p><b>Section:</b> 17.6.3.8 [res.on.functions] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
22381 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-18</p>
22382 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#res.on.functions">issues</a> in [res.on.functions].</p>
22383 <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>
22384 <p><b>Discussion:</b></p>
22386 <p><b>Addresses UK 179</b></p>
22389 According to the 4th bullet there is a problem if "if any replacement
22390 function or handler function or destructor operation throws an
22391 exception". There should be no problem throwing exceptions so long as
22392 they are caught within the function.
22400 The phrasing "throws an exception" is commonly used elsewhere
22401 to mean "throws or propagates an exception."
22402 Move to Open pending a possible more general resolution.
22411 Replace "propagates" in the proposed resolution with the phrase "exits
22412 via" and move to Ready.
22417 <p><b>Proposed resolution:</b></p>
22419 Change the 4th bullet of 17.6.3.8 [res.on.functions], p2:
22425 if any replacement function or handler function or destructor operation
22426 <del>throws</del> <ins>exits via</ins> an exception, unless specifically
22427 allowed in the applicable <i>Required behavior:</i> paragraph.
22438 <h3><a name="1008"></a>1008. <tt>nested_exception</tt> wording unclear</h3>
22439 <p><b>Section:</b> 18.8.6 [except.nested] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22440 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-04</p>
22441 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#except.nested">active issues</a> in [except.nested].</p>
22442 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#except.nested">issues</a> in [except.nested].</p>
22443 <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>
22444 <p><b>Discussion:</b></p>
22446 <p><b>Addresses JP 31</b></p>
22449 It is difficult to understand in which case <tt>nested_exception</tt> is applied.
22458 Alisdair will add an example in an update to
22459 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2619.pdf">N2619</a>.
22464 <p><b>Proposed resolution:</b></p>
22471 <h3><a name="1009"></a>1009. <tt>InputIterator</tt> post-increment dangerous</h3>
22472 <p><b>Section:</b> 24.2.1 [iterator.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22473 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-28</p>
22474 <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>
22475 <p><b>Discussion:</b></p>
22477 <p><b>Addresses UK 251</b></p>
22480 The post-increment operator is dangerous for a general InputIterator.
22481 The multi-pass guarantees that make it meaningful are defined as part of
22482 the ForwardIterator refinement. Any change will affect only constrained
22483 templates that have not yet been written, so should not break existing
22484 user iterators which remain free to add these operations. This change
22485 will also affect the generalised OutputIterator, although there is no
22486 percieved need for the post-increment operator in this case either.
22490 2009-07-28 Alisdair adds:
22495 We still think the issue is relevant, but needs totally rewording in
22496 non-concept language. We would like to see the issue retained as Open,
22497 rather than deferred as NAD Concepts. Review status is no longer
22503 <p><b>Proposed resolution:</b></p>
22505 Change 24.2.1 [iterator.iterators]:
22508 <blockquote><pre>concept Iterator<typename X> : Semiregular<X> {
22509 MoveConstructible reference = typename X::reference;
22510 <del>MoveConstructible postincrement_result;</del>
22512 <del>requires HasDereference<postincrement_result>;</del>
22514 reference operator*(X&&);
22515 X& operator++(X&);
22516 <del>postincrement_result operator++(X&, int);</del>
22521 <pre><del>postincrement_result operator++(X& r, int);</del>
22525 <del>-3- <i>Effects:</i> equivalent to <tt>{ X tmp = r; ++r; return tmp; }</tt>.</del>
22531 Change 24.2.2 [input.iterators]:
22535 <pre>concept InputIterator<typename X> : Iterator<X>, EqualityComparable<X> {
22536 ObjectType value_type = typename X::value_type;
22537 MoveConstructible pointer = typename X::pointer;
22539 SignedIntegralLike difference_type = typename X::difference_type;
22541 requires IntegralType<difference_type>
22542 && Convertible<reference, const value_type &>;
22543 && Convertible<pointer, const value_type*>;
22545 <del>requires Convertible<HasDereference<postincrement_result>::result_type, const value_type&>;</del>
22547 pointer operator->(const X&);
22553 Change 24.2.3 [output.iterators]:
22557 <pre>auto concept OutputIterator<typename X, typename Value> {
22558 requires Iterator<X>;
22560 typename reference = Iterator<X>::reference;
22561 <del>typename postincrement_result = Iterator<X>::postincrement_result;</del>
22562 requires SameType<reference, Iterator<X>::reference>
22563 <del>&& SameType<postincrement_result, Iterator<X>::postincrement_result></del>
22564 <del>&& Convertible<postincrement_result, const X&></del>
22565 && HasAssign<reference, Value>
22566 <del>&& HasAssign<HasDereference<postincrement_result>::result_type, Value></del>;
22572 Change 24.2.4 [forward.iterators]:
22576 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1084">1084</a> which is attempting to change this same area in a compatible
22582 <pre>concept ForwardIterator<typename X> : InputIterator<X>, Regular<X> {
22583 <del>requires Convertible<postincrement_result, const X&>;</del>
22585 <ins>MoveConstructible postincrement_result;</ins>
22586 <ins>requires HasDereference<postincrement_result>
22587 && Convertible<HasDereference<postincrement_result>::result_type, const value_type&>;</ins>
22589 <ins>postincrement_result operator++(X&, int);</ins>
22591 axiom MultiPass(X a, X b) {
22592 if (a == b) *a == *b;
22593 if (a == b) ++a == ++b;
22602 <pre><ins>postincrement_result operator++(X& r, int);</ins>
22607 <ins>-5- <i>Effects:</i> equivalent to <tt>{ X tmp = r; ++r; return tmp; }</tt>.</ins>
22619 <h3><a name="1011"></a>1011. <tt>next/prev</tt> wrong iterator type</h3>
22620 <p><b>Section:</b> 24.4 [iterator.operations] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22621 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-14</p>
22622 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#iterator.operations">active issues</a> in [iterator.operations].</p>
22623 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iterator.operations">issues</a> in [iterator.operations].</p>
22624 <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>
22625 <p><b>Discussion:</b></p>
22627 <p><b>Addresses UK 271</b></p>
22630 <tt>next/prev</tt> return an incremented iterator without changing the value of
22631 the original iterator. However, even this may invalidate an
22632 <tt>InputIterator</tt>. A <tt>ForwardIterator</tt> is required to guarantee the
22633 'multipass' property.
22641 We agree with the proposed resolution.
22642 Move to Tentatively Ready.
22651 Moved from Tentatively Ready to Open only because the wording needs to be
22652 tweaked for concepts removal.
22657 <p><b>Proposed resolution:</b></p>
22659 Change [iterator.synopsis]:
22662 <blockquote><pre>template <<del>InputIterator</del> <ins>ForwardIterator</ins> Iter>
22664 Iter::difference_type n = 1);
22665 </pre></blockquote>
22668 Change 24.4 [iterator.operations], p6:
22671 <blockquote><pre>template <<del>InputIterator</del> <ins>ForwardIterator</ins> Iter>
22673 Iter::difference_type n = 1);
22674 </pre></blockquote>
22682 <h3><a name="1012"></a>1012. <tt>reverse_iterator</tt> default ctor should value initialize</h3>
22683 <p><b>Section:</b> 24.5.1.2.1 [reverse.iter.cons] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Tentatively Ready</a>
22684 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-18</p>
22685 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20Ready">Tentatively Ready</a> status.</p>
22686 <p><b>Discussion:</b></p>
22688 <p><b>Addresses UK 277</b></p>
22691 The default constructor default-initializes current, rather than
22692 value-initializes. This means that when Iterator corresponds to a
22693 trivial type, the current member is left un-initialized, even when the
22694 user explictly requests value intialization! At this point, it is not
22695 safe to perform any operations on the reverse_iterator other than assign
22696 it a new value or destroy it. Note that this does correspond to the
22697 basic definition of a singular iterator.
22706 Agree with option i.
22710 Related issue: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#408">408</a>
22718 We believe this should be revisited
22719 in conjunction with issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#408">408</a>,
22720 which nearly duplicates this issue.
22725 2009-07 post-Frankfurt:
22731 Change "constructed" to "initialized" in two places in the proposed resolution.
22734 Move to Tentatively Ready.
22740 <p><b>Proposed resolution:</b></p>
22742 Change [reverse.iter.con]:
22745 <blockquote><pre>reverse_iterator();
22748 -1- <i>Effects:</i> <del>Default</del> <ins>Value</ins> initializes <tt>current</tt>. Iterator
22749 operations applied to the resulting iterator have defined behavior if and
22750 only if the corresponding operations are defined on a <del>default constructed</del>
22751 <ins>value initialized</ins>
22752 iterator of type <tt>Iterator</tt>.
22757 Change 24.5.2.2.1 [move.iter.op.const]:
22760 <blockquote><pre>move_iterator();
22763 -1- <i>Effects:</i> Constructs a <tt>move_iterator</tt>, <del>default</del> <ins>value</ins>
22764 initializing <tt>current</tt>.
22766 operations applied to the resulting iterator have defined behavior if and
22767 only if the corresponding operations are defined on a
22769 iterator of type <tt>Iterator</tt>.</ins>
22779 <h3><a name="1019"></a>1019. Response to UK 205</h3>
22780 <p><b>Section:</b> 20.6.3 [meta.help] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Tentatively Ready</a>
22781 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-18</p>
22782 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#meta.help">issues</a> in [meta.help].</p>
22783 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20Ready">Tentatively Ready</a> status.</p>
22784 <p><b>Discussion:</b></p>
22786 <p><b>Addresses UK 205</b></p>
22789 <tt>integral_constant</tt> objects should be usable in integral-constant-expressions.
22790 The addition to the language of literal types and the enhanced rules for
22791 constant expressions make this possible.
22799 We agree that the <tt>static</tt> data member
22800 ought be declared <tt>constexpr</tt>,
22801 but do not see a need for the proposed <tt>operator value_type()</tt>.
22802 (A use case would be helpful.)
22807 2009-05-23 Alisdair adds:
22813 The motivating case in my mind is that we can then use
22814 <tt>true_type</tt> and <tt>false_type</tt> as integral Boolean expressions, for example inside
22815 a <tt>static_assert</tt> declaration. In that sense it is purely a matter of style.
22818 Note that Boost has applied the non-explicit conversion operator for many
22819 years as it has valuable properties for extension into other metaprogramming
22820 libraries, such as MPL. If additional rationale is desired I will poll the
22821 Boost lists for why this extension was originally applied. I would argue
22822 that explicit conversion is more appropriate for 0x though.
22827 2009-07-04 Howard adds:
22833 Here's a use case which demonstrates the syntactic niceness which Alisdair describes:
22836 <blockquote><pre>#define requires(...) class = typename std::enable_if<(__VA_ARGS__)>::type
22838 template <class T, class U,
22839 requires(!is_lvalue_reference<T>() ||
22840 is_lvalue_reference<T>() && is_lvalue_reference<U>()),
22841 requires(is_same<typename base_type<T>::type,
22842 typename base_type<U>::type>)>
22845 forward(U&& t)
22847 return static_cast<T&&>(t);
22849 </pre></blockquote>
22853 2009-07 post-Frankfurt:
22858 Move to Tentatively Ready.
22863 <p><b>Proposed resolution:</b></p>
22865 Add to the <tt>integral_constant</tt> struct definition in 20.6.3 [meta.help]:
22868 <blockquote><pre>template <class T, T v>
22869 struct integral_constant {
22870 static const<ins>expr</ins> T value = v;
22871 typedef T value_type;
22872 typedef integral_constant<T,v> type;
22873 <ins>constexpr operator value_type() { return value; }</ins>
22875 </pre></blockquote>
22882 <h3><a name="1020"></a>1020. Response to UK 204</h3>
22883 <p><b>Section:</b> 20.6.7 [meta.trans.other] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22884 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-03-12</p>
22885 <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>
22886 <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>
22887 <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>
22888 <p><b>Discussion:</b></p>
22890 <p><b>Addresses UK 204</b></p>
22893 It is not possible to create a variant union based on a parameter pack
22894 expansion, e.g. to implement a classic discriminated union template.
22897 <p><b>Original proposed resolutuion:</b></p>
22900 Restore <tt>aligned_union</tt> template that was removed by LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#856">856</a>.
22909 Agree. The need for <tt>aligned_union</tt> is compelling enough to reinstate.
22913 Post Summit, Alisdair adds:
22919 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2843.html">N2843</a>
22920 proposes an extension to the <tt>[[align]]</tt> attribute
22921 that further diminishes the need for this template. Recommend NAD.
22926 <p><b>Proposed resolution:</b></p>
22933 <h3><a name="1030"></a>1030. Response to JP 44</h3>
22934 <p><b>Section:</b> 20.8.10.6 [util.smartptr.shared.atomic] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
22935 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-18</p>
22936 <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>
22937 <p><b>Discussion:</b></p>
22939 <p><b>Addresses JP 44</b></p>
22942 The 1st parameter <tt>p</tt> and 2nd parameter <tt>v</tt> is now
22943 <tt>shared_ptr<T>*</tt>.
22946 It should be <tt>shared_ptr<T>&</tt>, or if these are
22947 <tt>shared_ptr<T>*</tt> then add the "<tt>p</tt> shall not be a
22948 null pointer" at the requires.
22957 Agree. All of the functions need a requirement that <tt>p</tt> (or
22958 <tt>v</tt>) is a pointer to a valid object.
22962 2009-07 post-Frankfurt:
22968 Lawrence explained that these signatures match the regular atomics. The
22969 regular atomics must not use references because these signatures are
22970 shared with C. The decision to pass shared_ptrs by pointer rather than
22971 by reference was deliberate and was motivated by the principle of least
22975 Lawrence to write wording that requires that the pointers not be null.
22981 <p><b>Proposed resolution:</b></p>
22988 <h3><a name="1031"></a>1031. Response to US 78</h3>
22989 <p><b>Section:</b> 20.8.10.2 [util.smartptr.shared] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD%20Future">Tentatively NAD Future</a>
22990 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-11 <b>Last modified:</b> 2009-07-26</p>
22991 <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>
22992 <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>
22993 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20NAD%20Future">Tentatively NAD Future</a> status.</p>
22994 <p><b>Discussion:</b></p>
22996 <p><b>Addresses US 78</b></p>
22999 There is presently no way to convert directly from a <tt>shared_ptr</tt> to a
23000 <tt>unique_ptr</tt>. Add an interface that performs the conversion.
23009 We look forward to a paper on this topic. We recommend no action until a
23010 paper is available. We believe that the shared pointer must use the default
23011 deleter for the conversion to succeed.
23020 This is basically a request for <tt>shared_ptr<>::release</tt> in
23021 disguise, with all the associated problems. Not a good idea.
23025 2009-07 post-Frankfurt:
23031 The rationale for the omission of a release() member function from shared_ptr is given in:
23032 <a href="http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm">http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm</a>
23035 The implementation of such a member is non-trivial (and maybe
23036 impossible), because it would need to account for the deleter.
23041 2009-07-26 Howard sets to Tentatively NAD Future.
23047 I took an online poll and got 3 votes for NAD and 3 for NAD Future. Personally
23048 I prefer NAD Future as this does refer to an extension that could conceivably be
23049 considered beyond C++0X.
23053 However such an extension would need to solve a couple of problems:
23057 <li>What is the interface for such a conversion when the <tt>shared_ptr</tt> does
23058 not have unique ownership? Throw an exception? Create a null <tt>unique_ptr</tt>?
23059 Undefined behavior?
23064 How does one handle custom deleters given to the <tt>shared_ptr</tt> constructor?
23067 I do not believe it is possible to implement a general answer to this question.
23068 The <tt>shared_ptr</tt> deleter is a run time (or construction time) characteristic.
23069 The <tt>unique_ptr</tt> deleter is a compile time characteristic. In general one
23070 can not know to what type of <tt>unqiue_ptr</tt> you are converting to.
23073 One answer is for the user of the conversion to specify the deleter type and perhaps
23074 throw an exception if the specification turns out to be incorrect.
23077 Another answer is for the conversion to only be valid when the underlying deleter
23078 is <tt>default_delete</tt>. We would probalby need to specify that this is indeed the
23079 underlying deleter of a <tt>shared_ptr</tt> when a custom deleter is not given in
23086 At any rate, there are non-trivial design issues which would need to be implemented
23087 and tested in the field for usability prior to standardization.
23093 <p><b>Proposed resolution:</b></p>
23100 <h3><a name="1033"></a>1033. <tt>thread::join()</tt> effects?</h3>
23101 <p><b>Section:</b> 30.3.1.5 [thread.thread.member] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
23102 <b>Submitter:</b> Alberto Ganesh Barbati <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-05-23</p>
23103 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.thread.member">active issues</a> in [thread.thread.member].</p>
23104 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.thread.member">issues</a> in [thread.thread.member].</p>
23105 <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>
23106 <p><b>Discussion:</b></p>
23109 While looking at <tt>thread::join()</tt> I think I spotted a couple of
23110 possible defects in the specifications. I could not find a previous
23111 issue or NB comment about that, but I might have missed it.
23115 The postconditions clause for <tt>thread::join()</tt> is:
23119 <i>Postconditions:</i> If <tt>join()</tt> throws an exception, the value
23120 returned by <tt>get_id()</tt> is unchanged. Otherwise, <tt>get_id() == id()</tt>.
23124 and the throws clause is:
23128 <i>Throws:</i> <tt>std::system_error</tt> when the postconditions cannot be achieved.
23132 Now... how could the postconditions <em>not</em> be achieved?
23133 It's just a matter of resetting the value of <tt>get_id()</tt> or leave it
23134 unchanged! I bet we can always do that. Moreover, it's a chicken-and-egg
23135 problem: in order to decide whether to throw or not I depend on the
23136 postconditions, but the postconditions are different in the two cases.
23140 I believe the throws clause should be:
23144 <i>Throws:</i> <tt>std::system_error</tt> when the effects or postconditions
23145 cannot be achieved.
23149 as it is in <tt>detach()</tt>, or, even better, as the postcondition is
23150 trivially satisfiable and to remove the circular dependency:
23155 <i>Throws:</i> <tt>std::system_error</tt> if the effects cannot be achieved.
23159 Problem is that... ehm... <tt>join()</tt> has no "Effects" clause. Is that intentional?
23163 See the thread starting at c++std-lib-23204 for more discussion.
23173 Pete believes there may be some more general language (in frontmatter)
23174 that can address this and related issues such as <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#962">962</a>.
23182 <p><b>Proposed resolution:</b></p>
23189 <h3><a name="1034"></a>1034. Response to UK 222</h3>
23190 <p><b>Section:</b> 23.2.1 [container.requirements.general] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
23191 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-07-18</p>
23192 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements.general">active issues</a> in [container.requirements.general].</p>
23193 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements.general">issues</a> in [container.requirements.general].</p>
23194 <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>
23195 <p><b>Discussion:</b></p>
23197 <p><b>Addresses UK 222</b></p>
23200 It is not clear what purpose the Requirement tables serve in the
23201 Containers clause. Are they the definition of a library Container? Or
23202 simply a conventient shorthand to factor common semantics into a single
23203 place, simplifying the description of each subsequent container? This
23204 becomes an issue for 'containers' like <tt>array</tt>, which does not meet the
23205 default-construct-to-empty requirement, or <tt>forward_list</tt> which does not
23206 support the size operation. Are these components no longer containers?
23207 Does that mean the remaining requirements don't apply? Or are these
23208 contradictions that need fixing, despite being a clear design decision?
23216 Clarify all the tables in 23.2 [container.requirements] are
23217 there as a convenience for documentation, rather than a strict set of
23218 requirements. Containers should be allowed to relax specific
23219 requirements if they call attention to them in their documentation. The
23220 introductory text for <tt>array</tt> should be expanded to mention a
23221 default constructed <tt>array</tt> is not empty, and
23222 <tt>forward_list</tt> introduction should mention it does not provide
23223 the required <tt>size</tt> operation as it cannot be implemented
23233 Agree in principle.
23237 2009-07 post-Frankfurt:
23242 We agree in principle, but we have a timetable. This group feels that
23243 the issue should be closed as NAD unless a proposed resolution is
23244 submitted prior to the March 2010 meeting.
23249 <p><b>Proposed resolution:</b></p>
23256 <h3><a name="1035"></a>1035. Response to UK 226</h3>
23257 <p><b>Section:</b> 23.2.1 [container.requirements.general] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
23258 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-08-01</p>
23259 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#container.requirements.general">active issues</a> in [container.requirements.general].</p>
23260 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#container.requirements.general">issues</a> in [container.requirements.general].</p>
23261 <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>
23262 <p><b>Discussion:</b></p>
23264 <p><b>Addresses UK 226</b></p>
23267 <tt><array></tt> must be added to this list. In particular it
23268 doesn't satisfy: - no <tt>swap()</tt> function invalidates any
23269 references, pointers, or iterators referring to the elements of the
23270 containers being swapped. and probably doesn't satisfy: - no
23271 <tt>swap()</tt> function throws an exception.
23274 If <tt><array></tt> remains a container, this will have to also
23275 reference <tt>array</tt>, which will then have to say which of these
23276 points it satisfies.
23285 Agree. The proposed resolution is incomplete. Further work required.
23289 2009-05-01 Daniel adds:
23294 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1099">1099</a> also suggests
23295 adding move constructor to this.
23299 2009-07 post-Frankfurt:
23304 Howard is to draft a note that explains what happens to references.
23310 2009-08-01 Howard provided wording.
23314 <p><b>Proposed resolution:</b></p>
23316 Add a paragraph to 23.3.1.2 [array.special]:
23319 <blockquote><pre>template <Swappable T, size_t N> void swap(array<T,N>& x, array<T,N>& y);
23325 <blockquote><pre>swap_ranges(x.begin(), x.end(), y.begin());
23326 </pre></blockquote>
23330 Outstanding iterators, references and pointers may be invalidated.
23331 — <i>end note</i>]
23341 <h3><a name="1041"></a>1041. Response to UK 239</h3>
23342 <p><b>Section:</b> 23.2.4 [associative.reqmts] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
23343 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-07-18</p>
23344 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#associative.reqmts">issues</a> in [associative.reqmts].</p>
23345 <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>
23346 <p><b>Discussion:</b></p>
23348 <p><b>Addresses UK 239</b></p>
23351 It is not possible to take a move-only key out of an unordered
23352 container, such as (<tt>multi</tt>)<tt>set</tt> or
23353 (<tt>multi</tt>)<tt>map</tt>, or the new unordered containers.
23357 Add below <tt>a.erase(q)</tt>, <tt>a.extract(q)</tt>, with the following notation:
23360 <tt>a.extract(q)></tt>, Return type <tt>pair<key, iterator></tt>
23361 Extracts the element pointed to by <tt>q</tt> and erases it from the
23362 <tt>set</tt>. Returns a <tt>pair</tt> containing the value pointed to by
23363 <tt>q</tt> and an <tt>iterator</tt> pointing to the element immediately
23364 following <tt>q</tt> prior to the element being erased. If no such
23365 element exists,returns <tt>a.end()</tt>.
23374 We look forward to a paper on this topic. We recommend no action until a
23375 paper is available. The paper would need to address exception safety.
23379 Post Summit Alisdair adds:
23384 Would <tt>value_type</tt> be a better return type than <tt>key_type</tt>?
23388 2009-07 post-Frankfurt:
23393 Leave Open. Alisdair to contact Chris Jefferson about this.
23398 <p><b>Proposed resolution:</b></p>
23400 In 23.2.4 [associative.reqmts] Table 85, add:
23405 <caption>Table 85 -- Associative container requirements (in addition to container)</caption>
23407 <th>Expression</th>
23408 <th>Return type</th>
23409 <th>Assertion/note<br>pre-/post-condition</th>
23410 <th>Complexity</th>
23412 <tr><td><tt>a.erase(q)</tt></td>
23417 <td><ins><tt>a.extract(q)</tt></ins></td>
23418 <td><ins><tt>pair<key_type, iterator></tt></ins></td>
23419 <td><ins>Extracts the element pointed to by <tt>q</tt> and erases it from the <tt>set</tt>.
23420 Returns a <tt>pair</tt> containing the value pointed to by <tt>q</tt> and an <tt>iterator</tt>
23421 pointing to the element immediately following <tt>q</tt> prior to the element being
23422 erased. If no such element
23423 exists, returns <tt>a.end()</tt>.</ins></td>
23424 <td><ins>amortized constant</ins></td>
23430 In 23.2.5 [unord.req] Table 87, add:
23435 <caption>Table 87 -- Unordered associative container requirements (in addition to container)</caption>
23437 <th>Expression</th>
23438 <th>Return type</th>
23439 <th>Assertion/note<br>pre-/post-condition</th>
23440 <th>Complexity</th>
23442 <tr><td><tt>a.erase(q)</tt></td>
23447 <td><ins><tt>a.extract(q)</tt></ins></td>
23448 <td><ins><tt>pair<key_type, iterator></tt></ins></td>
23449 <td><ins>Extracts the element pointed to by <tt>q</tt> and erases it from the <tt>set</tt>.
23450 Returns a <tt>pair</tt> containing the value pointed to by <tt>q</tt> and an <tt>iterator</tt>
23451 pointing to the element immediately following <tt>q</tt> prior to the element being
23452 erased. If no such element
23453 exists, returns <tt>a.end()</tt>.</ins></td>
23454 <td><ins>amortized constant</ins></td>
23464 <h3><a name="1042"></a>1042. Response to UK 244</h3>
23465 <p><b>Section:</b> 23.3 [sequences] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
23466 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-07-18</p>
23467 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#sequences">issues</a> in [sequences].</p>
23468 <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>
23469 <p><b>Discussion:</b></p>
23471 <p><b>Addresses UK 244</b></p>
23474 The validity of the expression <tt>&a[n] == &a[0] + n</tt> is contingent on
23475 <tt>operator&</tt> doing the "right thing" (as captured by the <tt>CopyConstructible</tt>
23476 requirements in table 30 in C++2003). However this constraint has been
23477 lost in the Concepts of C++0x. This applies to <tt>vector</tt> and <tt>array</tt> (it
23478 actually applies to <tt>string</tt> also, but that's a different chapter, so I'll
23479 file a separate comment there and cross-reference).
23483 Suggested solution:
23487 Define a <tt>ContiguousStrorage</tt> and apply it to
23488 <tt>vector</tt>, <tt>array</tt> and <tt>string</tt>.
23497 Agree with the issue but not the details of the proposed solution. Walter to
23498 provide wording for the new concept.
23502 Post Summit Alisdair adds:
23507 Another LWG subgroup wondered if this concept
23508 should extend to <tt>complex<T></tt>, and so not be built on the container concept at
23513 2009-07 post-Frankfurt:
23518 Leave Open, pending a post-Concepts Working Draft.
23523 <p><b>Proposed resolution:</b></p>
23525 Add to <tt><container_concepts></tt> synopsis in 23.2.6 [container.concepts]
23528 <blockquote><pre><ins>concept< typename C > ContiguousStorageContainer <i>see below</i>;</ins>
23529 </pre></blockquote>
23532 Add a new section to the end of 23.2.6 [container.concepts]
23537 23.1.6.x ContiguousStorageContainer concept [container.concepts.contiguous]
23540 <pre>concept ContiguousStorageContainer< typename C >
23541 : Container<C>
23543 value_type* data(C&);
23545 axiom Contiguity(C& c, size_type i) {
23546 if( i < size(c) ) {
23547 addressof( * (data(c) + i) )
23548 == addressof( * advance(data(c), i) );
23555 The <tt>ContiguousStorageContainer</tt> concept describes a container whose elements
23556 are allocated in a single region of memory, and are stored sequentially
23557 without intervening padding other than to meet alignment requirements.
23558 For example, the elements may be stored in a
23559 single array of suitable length.
23562 <pre>value_type * data( C& );
23566 <i>Returns:</i> a pointer to the first element in the region of storage.
23567 Result is unspecified for an empty container.
23573 Change 23.3.1 [array] p1:
23577 -1- The header <tt><array></tt> defines a class template for
23578 storing fixed-size sequences of objects. An <tt>array</tt> supports
23579 random access iterators. An instance of <tt>array<T, N></tt>
23580 stores <tt>N</tt> elements of type <tt>T</tt>, so that <tt>size() ==
23581 N</tt> is an invariant. The elements of an <tt>array</tt> are stored
23582 contiguously, meaning that <del>if <tt>a</tt> is</del> an
23583 <tt>array<T, N></tt> <del>then it obeys the identity <tt>&a[n]
23584 == &a[0] + n</tt> for all <tt>0 <= n < N</tt></del>
23585 <ins>satisfies the concept <tt>ContiguousStorageContainer< array<T,
23586 N>></tt></ins>.
23590 Add to the synopsis in 23.3.1 [array]:
23593 <blockquote><pre> ...
23595 const T * data() const;
23598 <ins>template< typename T, size_t N ></ins>
23599 <ins>concept_map ContiguousStorageContainer< array<T, N>> {};</ins>
23601 </pre></blockquote>
23604 Change 23.3.6 [vector] p1:
23608 A <tt>vector</tt> is a sequence container that supports random access
23609 iterators. In addition, it supports (amortized) constant time insert and
23610 erase operations at the end; insert and erase in the middle take linear
23611 time. Storage management is handled automatically, though hints can be
23612 given to improve efficiency. The elements of a vector are stored
23613 contiguously, meaning that <del>if <tt>v</tt> is</del> a
23614 <tt>vector<T, Alloc></tt> <ins>(</ins>where <tt>T</tt> is some
23615 type other than <tt>bool</tt><ins>)</ins><del>, then it obeys the
23616 identity <tt>&v[n] == &v[0] + n</tt> for all <tt>0 <= n <
23617 v.size()</tt></del> <ins>satisfies the concept <tt>ContiguousStorageContainer<
23618 vector< T, Alloc>></tt></ins>.
23622 Add at the end of the synopsis in 23.3.6 [vector] p2:
23625 <blockquote><pre><ins>template< typename T, typename A >
23626 requires !SameType< T, bool >
23627 concept_map ContiguousStorageContainer< vector<T, A>> {};</ins>
23628 </pre></blockquote>
23636 <h3><a name="1043"></a>1043. Response to US 91</h3>
23637 <p><b>Section:</b> 29.6 [atomics.types.operations] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
23638 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-07-18</p>
23639 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics.types.operations">active issues</a> in [atomics.types.operations].</p>
23640 <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>
23641 <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>
23642 <p><b>Discussion:</b></p>
23644 <p><b>Addresses US 91</b></p>
23647 It is unclear whether or not a failed <tt>compare_exchange</tt> is a RMW operation
23648 (as used in 1.10 [intro.multithread]).
23652 Suggested solution:
23656 Make failing <tt>compare_exchange</tt> operations <b>not</b> be RMW.
23660 Anthony Williams adds:
23665 In 29.6 [atomics.types.operations] p18 it says that "These
23666 operations are atomic read-modify-write operations" (final sentence).
23667 This is overly restrictive on the implementations of
23668 <tt>compare_exchange_weak</tt> and <tt>compare_exchange_strong</tt> on platforms without a
23669 native CAS instruction.
23679 Group agrees with the resolution as proposed by Anthony Williams in the attached note.
23687 We recommend the proposed resolution be reviewed
23688 by members of the Concurrency Subgroup.
23692 2009-07 post-Frankfurt:
23697 This is likely to be addressed by Lawrence's upcoming paper. He will
23698 adopt the proposed resolution.
23703 <p><b>Proposed resolution:</b></p>
23705 Change 29.6 [atomics.types.operations] p18:
23709 -18- <i>Effects:</i> Atomically, compares the value pointed to by
23710 <tt>object</tt> or by <tt>this</tt> for equality with that in
23711 <tt>expected</tt>, and if true, replaces the value pointed to by
23712 <tt>object</tt> or by <tt>this</tt> with desired, and if false, updates
23713 the value in <tt>expected</tt> with the value pointed to by
23714 <tt>object</tt> or by <tt>this</tt>. Further, if the comparison is true,
23715 memory is affected according to the value of <tt>success</tt>, and if the
23716 comparison is false, memory is affected according to the value of
23717 <tt>failure</tt>. When only one <tt>memory_order</tt> argument is
23718 supplied, the value of <tt>success</tt> is <tt>order</tt>, and the value
23719 of <tt>failure</tt> is <tt>order</tt> except that a value of
23720 <tt>memory_order_acq_rel</tt> shall be replaced by the value
23721 <tt>memory_order_acquire</tt> and a value of
23722 <tt>memory_order_release</tt> shall be replaced by the value
23723 <tt>memory_order_relaxed</tt>. <ins>If the comparison is <tt>true</tt>, </ins>
23724 <del>T</del><ins>t</ins>hese operations are atomic
23725 read-modify-write operations (1.10).
23726 <ins>If the comparison is <tt>false</tt>, these
23727 operations are atomic load operations.</ins>
23736 <h3><a name="1046"></a>1046. Response to UK 329</h3>
23737 <p><b>Section:</b> 30.6 [futures] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
23738 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-03-13</p>
23739 <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>
23740 <p><b>Discussion:</b></p>
23742 <p><b>Addresses UK 329</b></p>
23745 <tt>future</tt>, <tt>promise</tt> and <tt>packaged_task</tt> provide a
23746 framework for creating future values, but a simple function to tie all
23747 three components together is missing. Note that we only need a *simple*
23748 facility for C++0x. Advanced thread pools are to be left for TR2.
23756 Provide a simple function along the lines of:
23758 <blockquote><pre>template< typename F, typename ... Args >
23759 requires Callable< F, Args... >
23760 future< Callable::result_type > async( F&& f, Args && ... );
23761 </pre></blockquote>
23764 Semantics are similar to creating a <tt>thread</tt> object with a <tt>packaged_task</tt>
23765 invoking <tt>f</tt> with <tt>forward<Args>(args...)</tt>
23766 but details are left unspecified to allow different scheduling and thread
23767 spawning implementations.
23770 It is unspecified whether a task submitted to async is run on its own thread
23771 or a thread previously used for another async task. If a call to <tt>async</tt>
23772 succeeds, it shall be safe to wait for it from any thread.
23775 The state of <tt>thread_local</tt> variables shall be preserved during <tt>async</tt> calls.
23778 No two incomplete async tasks shall see the same value of
23779 <tt>this_thread::get_id()</tt>.
23782 [<i>Note:</i> this effectively forces new tasks to be run on a new thread, or a
23783 fixed-size pool with no queue. If the
23784 library is unable to spawn a new thread or there are no free worker threads
23785 then the <tt>async</tt> call should fail. <i>--end note</i>]
23795 The concurrency subgroup has revisited this issue and decided that it
23796 could be considered a defect according to the Kona compromise. A task
23797 group was formed lead by Lawrence Crowl and Bjarne Stroustrup to write a
23798 paper for Frankfort proposing a simple asynchronous launch facility
23799 returning a <tt>future</tt>. It was agreed that the callable must be run on a
23800 separate thread from the caller, but not necessarily a brand-new thread.
23801 The proposal might or might not allow for an implementation that uses
23802 fixed-size or unlimited thread pools.
23805 Bjarne in c++std-lib-23121: I think that what we agreed was that to
23806 avoid deadlock <tt>async()</tt> would almost certainly be specified to launch in
23807 a different thread from the thread that executed <tt>async()</tt>, but I don't
23808 think it was a specific design constraint.
23814 <p><b>Proposed resolution:</b></p>
23821 <h3><a name="1047"></a>1047. Response to UK 334</h3>
23822 <p><b>Section:</b> 30.6.5 [futures.unique_future] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
23823 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-05-23</p>
23824 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#futures.unique_future">active issues</a> in [futures.unique_future].</p>
23825 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#futures.unique_future">issues</a> in [futures.unique_future].</p>
23826 <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>
23827 <p><b>Discussion:</b></p>
23829 <p><b>Addresses UK 334</b></p>
23832 Behaviour of <tt>get()</tt> is undefined if calling <tt>get()</tt> while
23833 not <tt>is_ready()</tt>. The intent is that <tt>get()</tt> is a blocking
23834 call, and will wait for the future to become ready.
23844 Agree, move to Review.
23849 2009-04-03 Thomas J. Gritzan adds:
23855 This issue also applies to <tt>shared_future::get()</tt>.
23863 Add a paragraph to [futures.shared_future]:
23866 <blockquote><pre>void shared_future<void>::get() const;
23869 <i>Effects:</i> If <tt>is_ready()</tt> would return <tt>false</tt>, block on the asynchronous
23870 result associated with <tt>*this</tt>.
23880 It is not clear to us that this is an issue,
23881 because the proposed resolution's Effects clause seems to duplicate
23882 information already present in the Synchronization clause.
23883 Keep in Review status.
23887 <p><b>Proposed resolution:</b></p>
23889 Add a paragraph to 30.6.5 [futures.unique_future]:
23892 <blockquote><pre>R&& unique_future::get();
23893 R& unique_future<R&>::get();
23894 void unique_future<void>::get();
23897 <p><i>Note:</i>...</p>
23899 <ins><i>Effects:</i> If <tt>is_ready()</tt> would return <tt>false</tt>,
23900 block on the asynchronous result associated with <tt>*this</tt>.</ins>
23903 <i>Synchronization:</i> if <tt>*this</tt> is associated with a
23904 <tt>promise</tt> object, the completion of <tt>set_value()</tt> or
23905 <tt>set_exception()</tt> to that <tt>promise</tt> happens before (1.10)
23906 <tt>get()</tt> returns.
23916 <h3><a name="1048"></a>1048. Response to UK 335</h3>
23917 <p><b>Section:</b> 30.6.5 [futures.unique_future] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
23918 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-03-13</p>
23919 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#futures.unique_future">active issues</a> in [futures.unique_future].</p>
23920 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#futures.unique_future">issues</a> in [futures.unique_future].</p>
23921 <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>
23922 <p><b>Discussion:</b></p>
23924 <p><b>Addresses UK 335</b></p>
23927 <tt>std::unique_future</tt> is <tt>MoveConstructible</tt>, so you can transfer the
23928 association with an asynchronous result from one instance to another.
23929 However, there is no way to determine whether or not an instance has
23930 been moved from, and therefore whether or not it is safe to wait for it.
23933 <blockquote><pre>std::promise<int> p;
23934 std::unique_future<int> uf(p.get_future());
23935 std::unique_future<int> uf2(std::move(uf));
23936 uf.wait(); <font color="#c80000">// oops, uf has no result to wait for. </font>
23937 </pre></blockquote>
23940 Suggest we add a <tt>waitable()</tt> function to <tt>unique_future</tt>
23941 (and <tt>shared_future</tt>) akin to <tt>std::thread::joinable()</tt>,
23942 which returns <tt>true</tt> if there is an associated result to wait for
23943 (whether or not it is ready).
23950 <blockquote><pre>if(uf.waitable()) uf.wait();
23951 </pre></blockquote>
23960 Create an issue. Requires input from Howard. Probably NAD.
23965 Post Summit, Howard thows in his two cents:
23971 Here is a copy/paste of my last prototype of <tt>unique_future</tt> which was
23972 several years ago. At that time I was calling <tt>unique_future</tt> <tt>future</tt>:
23975 <blockquote><pre>template <class R>
23979 typedef R result_type;
23981 future(const future&);// = delete;
23982 future& operator=(const future&);// = delete;
23984 template <class R1, class F1> friend class prommise;
23989 future(future&& f);
23990 future& operator=(future&& f);
23992 void swap(future&& f);
23994 <b>bool joinable() const;</b>
23995 bool is_normal() const;
23996 bool is_exceptional() const;
23997 bool is_ready() const;
24002 template <class ElapsedTime>
24003 bool timed_join(const ElapsedTime&);
24005 </pre></blockquote>
24008 <tt>shared_future</tt> had a similar interface. I intentionally reused
24009 the <tt>thread</tt> interface where possible to lessen the learning
24010 curve std::lib clients will be faced with.
24016 <p><b>Proposed resolution:</b></p>
24023 <h3><a name="1049"></a>1049. Response to UK 339</h3>
24024 <p><b>Section:</b> 30.6.4 [futures.promise] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
24025 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-05-23</p>
24026 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#futures.promise">active issues</a> in [futures.promise].</p>
24027 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#futures.promise">issues</a> in [futures.promise].</p>
24028 <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>
24029 <p><b>Discussion:</b></p>
24031 <p><b>Addresses UK 339</b></p>
24034 Move assignment is goiing in the wrong direction, assigning from
24035 <tt>*this</tt> to the passed rvalue, and then returning a reference to
24036 an unusable <tt>*this</tt>.
24046 Agree, move to Review.
24055 We recommend deferring this issue until after Detlef's paper (on futures)
24060 <p><b>Proposed resolution:</b></p>
24062 Strike 30.6.4 [futures.promise] p6 and change p7:
24065 <blockquote><pre>promise& operator=(promise&& rhs);
24069 <del>-6- <i>Effects:</i> move assigns its associated state to <tt>rhs</tt>.</del>
24072 -7- <i>Postcondition:</i> <del><tt>*this</tt> has no associated
24073 state.</del> <ins>associated state of <tt>*this</tt> is the same as the
24074 associated state of <tt>rhs</tt> before the call. <tt>rhs</tt> has no
24075 associated state.</ins>
24086 <h3><a name="1050"></a>1050. Response to UK 340</h3>
24087 <p><b>Section:</b> 30.6.4 [futures.promise] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
24088 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-05-23</p>
24089 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#futures.promise">active issues</a> in [futures.promise].</p>
24090 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#futures.promise">issues</a> in [futures.promise].</p>
24091 <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>
24092 <p><b>Discussion:</b></p>
24094 <p><b>Addresses UK 340</b></p>
24097 There is an implied postcondition for <tt>get_future()</tt> that the state of the
24098 <tt>promise</tt> is transferred into the <tt>future</tt> leaving the <tt>promise</tt> with no
24099 associated state. It should be spelled out.
24109 Agree, move to Review.
24114 2009-04-03 Thomas J. Gritzan adds:
24120 <tt>promise::get_future()</tt> must not invalidate the state of the promise object.
24123 A promise is used like this:
24125 <blockquote><pre>promise<int> p;
24126 unique_future<int> f = p.get_future();
24127 <font color="#c80000">// post 'p' to a thread that calculates a value </font>
24128 <font color="#c80000">// use 'f' to retrieve the value. </font>
24129 </pre></blockquote>
24131 So <tt>get_future()</tt> must return an object that shares the same associated
24132 state with <tt>*this</tt>.
24135 But still, this function should throw an <tt>future_already_retrieved</tt> error
24136 when it is called twice.
24139 <tt>packaged_task::get_future()</tt> throws <tt>std::bad_function_call</tt> if its <tt>future</tt>
24140 was already retrieved. It should throw
24141 <tt>future_error(future_already_retrieved)</tt>, too.
24144 Suggested resolution:
24147 Replace p12/p13 30.6.4 [futures.promise]:
24151 -12- <i>Throws:</i> <tt>future_error</tt> if <del><tt>*this</tt> has no associated state</del>
24152 <ins>the <tt>future</tt> has already been retrieved</ins>.
24155 -13- <i>Error conditions:</i> <tt>future_already_retrieved</tt> if <del><tt>*this</tt>
24156 has no associated state</del>
24157 <ins>the <tt>future</tt> associated with
24158 the associated state has already been retrieved</ins>.
24161 <ins><i>Postcondition:</i> The returned object and <tt>*this</tt> share the associated state.</ins>
24165 Replace p14 30.6.7 [futures.task]:
24169 -14- <i>Throws:</i> <tt><del>std::bad_function_call</del> <ins>future_error</ins></tt> if the future <del>associated with
24170 the task</del> has already been retrieved.
24174 <i>Error conditions:</i> <tt>future_already_retrieved</tt> if the <tt>future</tt> associated with
24175 the task has already been retrieved.
24178 <ins><i>Postcondition:</i> The returned object and <tt>*this</tt> share the associated task.</ins>
24188 Keep in Review status
24189 pending Detlef's forthcoming paper on futures.
24193 <p><b>Proposed resolution:</b></p>
24195 Add after p13 30.6.4 [futures.promise]:
24198 <blockquote><pre>unique_future<R> get_future();
24205 <i>Postcondition:</i> <tt>*this</tt> has no associated state.
24216 <h3><a name="1051"></a>1051. Response to UK 279</h3>
24217 <p><b>Section:</b> 24.5.1.2.12 [reverse.iter.opindex], 24.5.2.2.12 [move.iter.op.index] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24218 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-07-27</p>
24219 <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>
24220 <p><b>Discussion:</b></p>
24222 <p><b>Addresses UK 279</b></p>
24225 The reason the return type became unspecified is LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#386">386</a>. This
24226 reasoning no longer applies as there are at least two ways to get the right
24227 return type with the new language facilities added since the previous
24232 Proposal: Specify the return type using either decltype or the Iter concept_map.
24242 Under discussion. This is a general question about all iterator
24248 Howard adds post Summit:
24253 I am requesting test cases to demonstrate a position.
24257 2009-07-24 Daniel adds:
24263 I recommend NAD. Without concepts we can no longer
24264 restrict this member in a trivial way. Using <tt>decltype</tt> the
24265 declaration would be along the lines of
24267 <blockquote><pre>static const Iter& __base(); // not defined
24268 auto operator[](difference_type n) const -> decltype(__base()[-n-1]);
24269 </pre></blockquote>
24272 but once <tt>reverse_iterator</tt> is instantiated for some given type
24273 <tt>Iter</tt> which cannot form a well-formed expression <tt>__base()[-n-1]</tt>
24274 this would cause an ill-formed function declaration, diagnostic
24275 required, and no silent SFINAE elimination.
24282 <p><b>Proposed resolution:</b></p>
24289 <h3><a name="1052"></a>1052. Response to UK 281</h3>
24290 <p><b>Section:</b> 24.5.1.2.5 [reverse.iter.opref] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24291 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-08-01</p>
24292 <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>
24293 <p><b>Discussion:</b></p>
24295 <p><b>Addresses UK 281</b></p>
24298 The current specification for return value for <tt>reverse_iterator::operator-></tt>
24299 will always be a true pointer type, but <tt>reverse_iterator</tt> supports proxy
24300 iterators where the pointer type may be some kind of 'smart pointer'.
24310 <tt>move_iterator</tt> avoids this problem by returning a value of the wrapped
24312 study group formed to come up with a suggested resolution.
24315 <tt>move_iterator</tt> solution shown in proposed wording.
24320 2009-07 post-Frankfurt:
24325 Howard to deconceptize. Move to Review after that happens.
24329 2009-08-01 Howard deconceptized:
24338 <p><b>Proposed resolution:</b></p>
24340 Change synopsis in 24.5.1.1 [reverse.iterator]:
24343 <blockquote><pre>template <class Iterator>
24344 class reverse_iterator {
24346 typedef <del>typename iterator_traits<</del>Iterator<del>>::pointer</del> pointer;
24347 </pre></blockquote>
24350 Change 24.5.1.2.5 [reverse.iter.opref]:
24353 <blockquote><pre>pointer operator->() const;
24357 <blockquote><pre><del>&(operator*());</del>
24358 <ins>this->tmp = current;</ins>
24359 <ins>--this->tmp;</ins>
24360 <ins>return this->tmp;</ins>
24361 </pre></blockquote>
24371 <h3><a name="1053"></a>1053. Response to UK 295</h3>
24372 <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>
24373 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-03-13</p>
24374 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#algorithms">active issues</a> in [algorithms].</p>
24375 <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>
24376 <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>
24377 <p><b>Discussion:</b></p>
24379 <p><b>Addresses UK 295</b></p>
24382 There is a level of redundancy in the library specification for many
24383 algorithms that can be eliminated with the combination of concepts and
24384 default parameters for function templates. Eliminating redundancy simplified
24385 specification and reduces the risk of introducing accidental
24389 Proposed resolution: Adopt
24390 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2743.pdf">N2743</a>.
24400 NAD, this change would break code that takes the address of an
24406 Post Summit Alisdair adds:
24412 Request 'Open'. The issues in the paper go beyond just reducing
24413 the number of signatures, but cover unifying the idea of the ordering
24414 operation used by algorithms, containers and other library components. At
24415 least, it takes a first pass at the problem.
24419 For me (personally) that was the more important part of the paper, and not
24420 clearly addressed by the Summit resolution.
24426 <p><b>Proposed resolution:</b></p>
24433 <h3><a name="1054"></a>1054. <tt>forward</tt> broken</h3>
24434 <p><b>Section:</b> 20.3.2 [forward] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24435 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-03-13 <b>Last modified:</b> 2009-08-02</p>
24436 <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>
24437 <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>
24438 <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>
24439 <p><b>Discussion:</b></p>
24442 This is a placeholder issue to track the fact that we (well I) put the standard
24443 into an inconsistent state by requesting that we accept
24444 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html">N2844</a>
24445 except for the proposed changes to [forward].
24449 There will exist in the post meeting mailing
24450 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2835.html">N2835</a>
24451 which in its current state reflects the state of affairs prior to the Summit
24452 meeting. I hope to update it in time for the post Summit mailing, but as I write
24453 this issue I have not done so yet.
24461 Move to Open, awaiting the promised paper.
24465 2009-08-02 Howard adds:
24471 My current preferred solution is:
24474 <blockquote><pre>template <class T>
24477 typedef typename remove_cv<typename remove_reference<T>::type>::type type;
24480 template <class T, class U,
24481 class = typename enable_if<
24482 !is_lvalue_reference<T>::value ||
24483 is_lvalue_reference<T>::value &&
24484 is_lvalue_reference<U>::value>::type,
24485 class = typename enable_if<
24486 is_same<typename __base_type<T>::type,
24487 typename __base_type<U>::type>::value>::type>
24490 forward(U&& t)
24492 return static_cast<T&&>(t);
24494 </pre></blockquote>
24497 This has been tested by Bill, Jason and myself.
24501 It allows the following lvalue/rvalue casts:
24506 Cast an lvalue <tt>t</tt> to an lvalue <tt>T</tt> (identity).
24509 Cast an lvalue <tt>t</tt> to an rvalue <tt>T</tt>.
24512 Cast an rvalue <tt>t</tt> to an rvalue <tt>T</tt> (identity).
24522 Cast an rvalue <tt>t</tt> to an lvalue <tt>T</tt>.
24525 Cast one type <tt>t</tt> to another type <tt>T</tt> (such as <tt>int</tt> to <tt>double</tt>).
24530 "a." is disallowed as it can easily lead to dangling references.
24531 "b." is disallowed as this function is meant to only change the lvalue/rvalue
24532 characteristic of an expression.
24536 Jason has expressed concern that "b." is not dangerous and is useful in contexts
24537 where you want to "forward" a derived type as a base type. I find this use case
24538 neither dangerous, nor compelling. I.e. I could live with or without the "b."
24539 constraint. Without it, forward would look like:
24542 <blockquote><pre>template <class T, class U,
24543 class = typename enable_if<
24544 !is_lvalue_reference<T>::value ||
24545 is_lvalue_reference<T>::value &&
24546 is_lvalue_reference<U>::value>::type>
24549 forward(U&& t)
24551 return static_cast<T&&>(t);
24553 </pre></blockquote>
24559 <blockquote><pre>template <class T, class U,
24560 class = typename enable_if<
24561 !is_lvalue_reference<T>::value ||
24562 is_lvalue_reference<T>::value &&
24563 is_lvalue_reference<U>::value>::type,
24564 class = typename enable_if<
24565 is_base_of<typename __base_type<U>::type,
24566 typename __base_type<T>::type>::value>::type>
24569 forward(U&& t)
24571 return static_cast<T&&>(t);
24573 </pre></blockquote>
24577 The "promised paper" is not in the post-Frankfurt mailing only because I'm waiting
24578 for the non-concepts draft. But I'm hoping that by adding this information here
24579 I can keep people up to date.
24585 <p><b>Proposed resolution:</b></p>
24592 <h3><a name="1055"></a>1055. Response to UK 98</h3>
24593 <p><b>Section:</b> 20.6.7 [meta.trans.other] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24594 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-05-23</p>
24595 <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>
24596 <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>
24597 <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>
24598 <p><b>Discussion:</b></p>
24600 <p><b>Addresses UK 98</b></p>
24603 It would be useful to be able to determine the underlying
24604 type of an arbitrary enumeration type. This would allow
24605 safe casting to an integral type (especially needed for
24606 scoped enums, which do not promote), and would allow
24607 use of <tt>numeric_limits</tt>. In general it makes generic
24608 programming with enumerations easier.
24616 Pete observes (and Tom concurs)
24617 that the proposed resolution seems to require compiler support
24618 for its implementation,
24619 as it seems necessary to look at the range of values
24620 of the enumerated type.
24621 To a first approximation,
24622 a library solution could give an answer based on the size of the type.
24623 If the user has specialized <tt>numeric_limits</tt> for the enumerated type,
24624 then the library might be able to do better,
24625 but there is no such requirement.
24626 Keep status as Open
24627 and solicit input from CWG.
24631 2009-05-23 Alisdair adds:
24636 Just to confirm that the BSI originator of this comment assumed it did
24637 indeed imply a compiler intrinsic. Rather than request a Core extension, it
24638 seemed in keeping with that the type traits interface provides a library API
24639 to unspecified compiler features - where we require several other traits
24640 (e.g. <tt>has_trivial_*</tt>) to get the 'right' answer now, unlike in TR1.
24644 <p><b>Proposed resolution:</b></p>
24646 Add a new row to the table in 20.6.7 [meta.trans.other]:
24651 <caption>Table 41 -- Other transformations</caption>
24659 <tt>template< class T > struct enum_base;</tt>
24662 <tt>T</tt> shall be an enumeration type (7.2 [dcl.enum])
24665 The member typedef <tt>type</tt> shall name the underlying type
24666 of the enum <tt>T</tt>.
24677 <h3><a name="1056"></a>1056. Must all Engines and Distributions be Streamable?</h3>
24678 <p><b>Section:</b> 26.5 [rand] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24679 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-12 <b>Last modified:</b> 2009-05-31</p>
24680 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand">issues</a> in [rand].</p>
24681 <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>
24682 <p><b>Discussion:</b></p>
24685 Both the concepts <tt>RandomNumberEngine</tt> and <tt>RandomNumberDistribution</tt> have
24686 requirements to be <tt>InputStreamable</tt> and <tt>OutputStreamable</tt>.
24689 I have no problems leaving the WP in an inconsistent state on the best-faith
24690 assumption these concepts will be provided later, however disagree with the
24691 proposers that these constraints are not separable, orthogonal to the basic
24692 concepts of generating random number distributions.
24695 These constraints should be dropped, and applied to specific algorithms as
24699 If a more refined concept (certainly deemed useful by the proposers) is
24700 proposed there is no objection, but the basic concept should not require
24701 persistence via streaming.
24713 2009-05-31 Alisdair adds:
24719 Working on constraining the stream iterators, I have a few more observations
24720 to make on the concepts proposed while constraining the random number
24724 While I still believe the concerns are orthogonal, I don't believe the
24725 existing constraints go far enough either! The goal we want to achieve is
24726 not that a <tt>RandomNumberEngine</tt> / <tt>RandomNumberDistribution</tt> supports the stream
24727 operators, but that it is <tt>Serializable</tt>. I.e. there is a relationship
24728 between the insert and extract operations that guarantees to restore the
24729 state of the original object. This implies a coupling of the concepts
24730 together in a broader concept (<tt>Serializable</tt>) with at least one axiom to
24731 assert the semantics.
24734 One problem is that <tt>istream</tt> and <tt>ostream</tt> may be fundamentally different
24735 types, although we can hook a relation if we are prepared to drop down to
24736 the <tt>char</tt> type and <tt>char_traits</tt> template parameters. Doing so ties us to a
24737 form of serialization that demands implementation via the std iostreams
24738 framework, which seems overly prescriptive. I believe the goal is generally
24739 to support serialization without regard to how it is expressed - although
24740 this is getting even more inventive in terms of concepts we do not have
24746 <p><b>Proposed resolution:</b></p>
24753 <h3><a name="1062"></a>1062. Missing insert_iterator for stacks/queues</h3>
24754 <p><b>Section:</b> 24.7 [insert.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD%20Future">Tentatively NAD Future</a>
24755 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-13 <b>Last modified:</b> 2009-07-29</p>
24756 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#insert.iterators">active issues</a> in [insert.iterators].</p>
24757 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#insert.iterators">issues</a> in [insert.iterators].</p>
24758 <p><b>View all issues with</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html#Tentatively%20NAD%20Future">Tentatively NAD Future</a> status.</p>
24759 <p><b>Discussion:</b></p>
24762 It is odd that we have an iterator to insert into a <tt>vector</tt>, but not an
24763 iterator to insert into a <tt>vector</tt> that is adapted as a <tt>stack</tt>. The standard
24764 container adapters all have a common interface to <tt>push</tt> and <tt>pop</tt> so it should
24765 be simple to create an iterator adapter to complete the library support.
24769 We should provide an <tt>AdaptedContainer</tt> concept supporting <tt>push</tt> and <tt>pop</tt>
24770 operations. Create a new insert iterator and factory function that inserts
24771 values into the container by calling <tt>push</tt>.
24780 Walter recommends NAD Future.
24783 Move to Open, and recommend deferring the issue until after the next
24784 Committee Draft is issued.
24789 2009-07-29 Howard moves to Tentatively NAD Future.
24794 A poll on the LWG reflector voted unanimously to move this issue to Tentatively NAD Future.
24798 <p><b>Proposed resolution:</b></p>
24805 <h3><a name="1064"></a>1064. Response to UK 152</h3>
24806 <p><b>Section:</b> 17.3.15 [defns.obj.state] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24807 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-03-15 <b>Last modified:</b> 2009-03-15</p>
24808 <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>
24809 <p><b>Discussion:</b></p>
24811 <p><b>Addresses UK 152</b></p>
24814 Object state is using a definition of object (instance of a class) from
24815 outside the standard, rather than the 'region of storage' definiton in
24816 1.8 [intro.object]p1
24824 We think we're removing this; See X [func.referenceclosure.cons].
24828 <p><b>Proposed resolution:</b></p>
24837 <h3><a name="1068"></a>1068. class random_device should be movable</h3>
24838 <p><b>Section:</b> 26.5.6 [rand.device] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24839 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-18 <b>Last modified:</b> 2009-05-23</p>
24840 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#rand.device">issues</a> in [rand.device].</p>
24841 <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>
24842 <p><b>Discussion:</b></p>
24845 class <tt>random_device</tt> should be movable.
24853 Move to Open, and recommend this issue be deferred until after the next
24854 Committee Draft is issued.
24858 <p><b>Proposed resolution:</b></p>
24865 <h3><a name="1069"></a>1069. class seed_seq should support efficient move operations</h3>
24866 <p><b>Section:</b> 26.5.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>
24867 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-18 <b>Last modified:</b> 2009-05-23</p>
24868 <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>
24869 <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>
24870 <p><b>Discussion:</b></p>
24873 class <tt>seed_seq</tt> should support efficient move operations.
24881 Move to Open, and recommend this issue be deferred until after the next
24882 Committee Draft is issued.
24886 <p><b>Proposed resolution:</b></p>
24893 <h3><a name="1071"></a>1071. is_bind_expression should derive from integral_constant<bool></h3>
24894 <p><b>Section:</b> 20.7.12.1.1 [func.bind.isbind] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
24895 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-19 <b>Last modified:</b> 2009-05-31</p>
24896 <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>
24897 <p><b>Discussion:</b></p>
24900 Class template is_bind_expression 20.7.12.1.1 [func.bind.isbind]:
24903 <blockquote><pre>namespace std {
24904 template<class T> struct is_bind_expression {
24905 static const bool value = see below;
24908 </pre></blockquote>
24910 <tt>is_bind_expression</tt> should derive from <tt>std::integral_constant<bool></tt> like
24911 other similar trait types.
24919 We need the same thing for the trait <tt>is_placeholder</tt> as well.
24922 2009-03-22 Daniel provided wording.
24932 We recommend this be deferred until after the next Committee Draft is issued.
24940 2009-05-31 Peter adds:
24946 I am opposed to the proposed resolution and to the premise of the issue
24947 in general. The traits's default definitions should NOT derive from
24948 <tt>integral_constant</tt>, because this is harmful, as it misleads people into
24949 thinking that <tt>is_bind_expression<E></tt> always derives from
24950 <tt>integral_constant</tt>, whereas it may not.
24953 <tt>is_bind_expression</tt> and <tt>is_placeholder</tt> allow user
24954 specializations, and in fact, this is their primary purpose. Such user
24955 specializations may not derive from <tt>integral_constant</tt>, and the
24956 places where <tt>is_bind_expression</tt> and <tt>is_placeholder</tt> are
24957 used intentionally do not require such derivation.
24960 The long-term approach here is to switch to
24961 <tt>BindExpression<E></tt> and <tt>Placeholder<P></tt>
24962 explicit concepts, of course, but until that happens, I say leave them
24969 <p><b>Proposed resolution:</b></p>
24973 In 20.7.12.1.1 [func.bind.isbind] change as indicated:
24975 <blockquote><pre>namespace std {
24976 template<class T> struct is_bind_expression <ins>: integral_constant<bool, <i>see below</i>> { };</ins><del>{
24977 static const bool value = <i>see below</i>;
24980 </pre></blockquote>
24984 In 20.7.12.1.1 [func.bind.isbind]/2 change as indicated:
24986 <blockquote><pre><del>static const bool value;</del>
24989 -2- <del><tt>true</tt> if <tt>T</tt> is a type returned from <tt>bind</tt>, <tt>false</tt> otherwise.</del>
24990 <ins>If <tt>T</tt> is a type returned from <tt>bind</tt>, <tt>is_bind_expression<T></tt> shall
24991 be publicly derived from
24992 <tt>integral_constant<bool, true></tt>, otherwise it shall be
24993 publicly derived from
24994 <tt>integral_constant<bool, false></tt>.</ins>
25000 In 20.7.12.1.2 [func.bind.isplace] change as indicated:
25002 <blockquote><pre>namespace std {
25003 template<class T> struct is_placeholder <ins>: integral_constant<int, <i>see below</i>> { };</ins><del>{
25004 static const int value = <i>see below</i>;
25007 </pre></blockquote>
25011 In 20.7.12.1.2 [func.bind.isplace]/2 change as indicated:
25013 <blockquote><pre><del>static const int value;</del>
25016 -2- <del>value is <tt>J</tt> if <tt>T</tt> is the type of <tt>std::placeholders::_J</tt>, 0 otherwise.</del>
25017 <ins>If <tt>T</tt> is the type of <tt>std::placeholders::_J</tt>, <tt>is_placeholder<T></tt>
25019 derived from <tt>integral_constant<int, J></tt> otherwise it shall
25020 be publicly derived
25021 from <tt>integral_constant<int, 0></tt>.</ins>
25032 <h3><a name="1075"></a>1075. Response to US 65, US 74.1</h3>
25033 <p><b>Section:</b> 20 [utilities], 23 [containers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
25034 <b>Submitter:</b> Alan Talbot <b>Opened:</b> 2009-03-20 <b>Last modified:</b> 2009-06-10</p>
25035 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#utilities">issues</a> in [utilities].</p>
25036 <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>
25037 <p><b>Discussion:</b></p>
25038 <p><b>Addresses US 65 and US 74.1</b></p>
25043 Scoped allocators and allocator propagation traits add a small amount of
25044 utility at the cost of a great deal of machinery. The machinery is user
25045 visible, and it extends to library components that don't have any
25046 obvious connection to allocators, including basic concepts and simple
25047 components like <tt>pair</tt> and <tt>tuple</tt>.
25049 <p>Suggested resolution:</p>
25052 Sketch of proposed resolution: Eliminate scoped allocators, replace
25053 allocator propagation traits with a simple uniform rule (e.g. always
25054 propagate on copy and move), remove all mention of allocators from
25055 components that don't explicitly allocate memory (e.g. pair), and adjust
25056 container interfaces to reflect this simplification.
25059 Components that I propose eliminating include HasAllocatorType,
25060 is_scoped_allocator, allocator_propagation_map, scoped_allocator_adaptor,
25061 and ConstructibleAsElement.
25069 Scoped allocators represent a poor trade-off for standardization, since
25070 (1) scoped-allocator--aware containers can be implemented outside the
25071 C++ standard library but used with its algorithms, (2) scoped
25072 allocators only benefit a tiny proportion of the C++ community
25073 (since few C++ programmers even use today's allocators), and (3) all C++
25074 users, especially the vast majority of the C++ community that won't ever
25075 use scoped allocators are forced to cope with the interface complexity
25076 introduced by scoped allocators.
25079 In essence, the larger community will suffer to support a very small
25080 subset of the community who can already implement their own
25081 data structures outside of the standard library. Therefore, scoped
25082 allocators should be removed from the working paper.
25085 Some evidence of the complexity introduced by scoped allocators:
25089 20.3.3 [pairs], 20.5 [tuple]: Large increase in the
25090 number of pair and tuple constructors.
25093 23 [containers]: Confusing "AllocatableElement" requirements throughout.
25096 <p>Suggested resolution:</p>
25099 Remove support for scoped allocators from the working paper. This
25100 includes at least the following changes:
25105 Remove 20.8.3 [allocator.element.concepts]
25108 Remove 20.8.5 [allocator.adaptor]
25111 Remove [construct.element]
25114 In Clause 23 [containers]: replace requirements naming the
25115 <tt>AllocatableElement</tt> concept with requirements naming <tt>CopyConstructible</tt>,
25116 <tt>MoveConstructible</tt>, <tt>DefaultConstructible</tt>, or <tt>Constructible</tt>, as
25124 Post Summit Alan moved from NAD to Open.
25129 2009-05-15 Ganesh adds:
25135 The requirement <tt>AllocatableElement</tt> should not be replaced with
25136 <tt>Constructible</tt> on the <tt>emplace_xxx()</tt> functions as suggested. In the
25137 one-parameter case the <tt>Constructible</tt> requirement is not satisfied when
25138 the constructor is explicit (as per 14.10.2.1 [concept.map.fct], twelfth
25139 bullet) but we do want to allow explicit constructors in emplace, as the
25140 following example shows:
25143 <blockquote><pre>vector<shared_ptr<int>> v;
25144 v.emplace_back(new int); <font color="#c80000">// should be allowed</font>
25145 </pre></blockquote>
25148 If the issue is accepted and scoped allocators are removed, I suggest to
25149 add a new pair of concepts to 20.2.7 [concept.construct], namely:
25152 <blockquote><pre>auto concept HasExplicitConstructor<typename T, typename... Args> {
25153 explicit T::T(Args...);
25156 auto concept ExplicitConstructible<typename T, typename... Args>
25157 : HasExplicitConstructor<T, Args...>, NothrowDestructible<T>
25159 </pre></blockquote>
25162 We should then use <tt>ExplicitConstructible</tt> as the requirement for all
25163 <tt>emplace_xxx()</tt> member functions.
25166 For coherence and consistency with the similar concepts
25167 <tt>Convertible/ExplicitlyConvertible</tt>, we might also consider changing
25168 <tt>Constructible</tt> to:
25171 <blockquote><pre>auto concept Constructible<typename T, typename... Args>
25172 : HasConstructor<T, Args...>, ExplicitConstructible<T, Args...>
25174 </pre></blockquote>
25177 Moreover, all emplace-related concepts in 23.2.6 [container.concepts]
25178 should also use <tt>ExplicitConstructible</tt> instead of <tt>Constructible</tt> in the
25179 definitions of their axioms. In fact the concepts in 23.2.6 [container.concepts] should be
25180 corrected even if the issue is not accepted.
25183 On the other hand, if the issue is not accepted, the scoped allocator
25184 adaptors should be fixed because the following code:
25187 <blockquote><pre>template <typename T> using scoped_allocator = scoped_allocator_adaptor<allocator<T>>;
25189 vector<shared_ptr<int>, scoped_allocator<shared_ptr<int>>> v;
25190 v.emplace_back(new int); <font color="#c80000">// ops! doesn't compile</font>
25191 </pre></blockquote>
25194 doesn't compile, as the member function <tt>construct()</tt> of the scoped
25195 allocator requires non-explicit constructors through concept
25196 <tt>ConstructibleWithAllocator</tt>. Fixing that is not difficult but probably
25197 more work than it's worth and is therefore, IMHO, one more reason in
25198 support of the complete removal of scoped allocators.
25203 2009-06-09 Alan adds:
25209 I reopened this issue because I did not think that these National Body
25210 comments were adequately addressed by marking them NAD. My understanding
25211 is that something can be marked NAD if it is clearly a misunderstanding
25212 or trivial, but a substantive issue that has any technical merit
25213 requires a disposition that addresses the concerns.
25216 The notes in the NB comment list (US 65 & US 74.1) say that:
25220 this issue has not introduced any new arguments not previously discussed,
25223 the vote (4-9-3) was not a consensus for removing scoped allocators,
25226 the issue is resolved by
25227 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2840.pdf">N2840</a>.
25235 there are new arguments in both comments regarding concepts (which were
25236 not present in the library when the scoped allocator proposal was voted
25240 the vote was clearly not a consensus for removal, but just saying there
25241 was a vote does not provide a rationale,
25244 I do not believe that N2840 addresses these comments (although it does
25245 many other things and was voted in with strong approval).
25250 My motivation to open the issue was to ensure that the NB comments were
25251 adequately addressed in a way that would not risk a "no" vote on our
25252 FCD. If there are responses to the technical concerns raised, then
25253 perhaps they should be recorded. If the members of the NB who authored
25254 the comments are satisfied with N2840 and the other disposition remarks
25255 in the comment list, then I am sure they will say so. In either case,
25256 this issue can be closed very quickly in Frankfurt, and hopefully will
25257 have helped make us more confident of approval with little effort. If in
25258 fact there is controversy, my thought is that it is better to know now
25259 rather than later so there is more time to deal with it.
25265 <p><b>Proposed resolution:</b></p>
25272 <h3><a name="1076"></a>1076. unary/binary_negate need constraining and move support</h3>
25273 <p><b>Section:</b> 20.7.11 [negators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
25274 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-20 <b>Last modified:</b> 2009-05-23</p>
25275 <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>
25276 <p><b>Discussion:</b></p>
25278 The class templates <tt>unary/binary_negate</tt> need constraining and move support.
25281 Ideally these classes would be deprecated, allowing <tt>unary/binary_function</tt> to
25282 also be deprecated. However, until a generic negate adaptor is introduced
25283 that can negate any <tt>Callable</tt> type, they must be supported so should be
25284 constrained. Likewise, they should be movable, and support adopting a
25285 move-only predicate type.
25288 In order to preserve ABI compatibility, new rvalue overloads are supplied in
25289 preference to changing the existing pass-by-const-ref to pass-by-value.
25292 Do not consider the issue of forwarding mutable lvalues at this point,
25293 although remain open to another issue on the topic.
25297 2009-05-01 Daniel adds:
25302 IMO the currently proposed resolution needs some updates
25303 because it is ill-formed at several places:
25309 In concept AdaptableUnaryFunction change
25311 <blockquote><pre>typename X::result_type;
25312 typename X::argument_type;
25313 </pre></blockquote>
25317 <blockquote><pre>Returnable result_type = typename X::result_type;
25318 typename argument_type = typename X::argument_type;
25319 </pre></blockquote>
25321 [The replacement "Returnable result_type" instead of "typename
25322 result_type" is non-editorial, but maybe you prefer that as well]
25327 In concept AdaptableBinaryFunction change
25329 <blockquote><pre>typename X::result_type;
25330 typename X::first_argument_type;
25331 typename X::second_argument_type;
25332 </pre></blockquote>
25336 <blockquote><pre>Returnable result_type = typename X::result_type;
25337 typename first_argument_type = typename X::first_argument_type;
25338 typename second_argument_type = typename X::second_argument_type;
25339 </pre></blockquote>
25341 [The replacement "Returnable result_type" instead of "typename
25342 result_type" is non-editorial, but maybe you prefer that as well.]
25348 In class unary/binary_function
25352 I suggest to change "ReturnType" to "Returnable" in both cases.
25355 I think you want to replace the remaining occurrences of "Predicate" by "P"
25356 (in both classes in copy/move from a predicate)
25362 I think you need to change the proposed signatures of not1 and not2, because
25363 they would still remain unconstrained: To make them constrained at least a
25364 single requirement needs to be added to enable requirement implication. This
25365 could be done via a dummy ("requires True<true>") or just explicit as follows:
25369 <blockquote><pre>template <AdaptableUnaryFunction P>
25370 requires Predicate< P, P::argument_type>
25371 unary_negate<P> not1(const P&& pred);
25372 template <AdaptableUnaryFunction P>
25373 requires Predicate< P, P::argument_type >
25374 unary_negate<P> not1(P&& pred);
25377 -3- Returns: unary_negate<P>(pred).
25381 [Don't we want a move call for the second overload as in
25383 <blockquote><pre>unary_negate<P>(std::move(pred))
25384 </pre></blockquote>
25386 in the Returns clause ?]
25390 <pre>template <AdaptableBinaryFunction P>
25391 requires Predicate< P, P::first_argument_type, P::second_argument_type >
25392 binary_negate<P> not2(const P& pred);
25393 template <AdaptableBinaryFunction P>
25394 requires Predicate< P, P::first_argument_type, P::second_argument_type >
25395 binary_negate<P> not2(P&& pred);
25398 -5- Returns: binary_negate<P>(pred).
25401 [Don't we want a move call for the second overload as in
25403 <blockquote><pre>binary_negate<P>(std::move(pred))
25404 </pre></blockquote>
25406 in the Returns clause ?]
25420 There is concern that complicating the solution
25421 to preserve the ABI seems unnecessary,
25422 since we're not in general preserving the ABI.
25425 We would prefer a separate paper consolidating all Clause 20
25426 issues that are for the purpose of providing constrained versions
25427 of the existing facilities.
25435 <p><b>Proposed resolution:</b></p>
25437 Add new concepts where appropriate::
25440 <blockquote><pre>auto concept AdaptableUnaryFunction< typename X > {
25441 typename X::result_type;
25442 typename X::argument_type;
25445 auto concept AdaptableBinaryFunction< typename X > {
25446 typename X::result_type;
25447 typename X::first_argument_type;
25448 typename X::second_argument_type;
25450 </pre></blockquote>
25457 Base 20.7.3 [base] (Only change is constrained Result)
25462 -1- The following classes are provided to simplify the typedefs of the
25463 argument and result types:
25465 <pre>namespace std {
25466 template <class Arg, <del>class</del> <ins>ReturnType</ins> Result>
25467 struct unary_function {
25468 typedef Arg argument_type;
25469 typedef Result result_type;
25472 template <class Arg1, class Arg2, <del>class</del> <ins>ReturnType</ins> Result>
25473 struct binary_function {
25474 typedef Arg1 first_argument_type;
25475 typedef Arg2 second_argument_type;
25476 typedef Result result_type;
25479 </pre></blockquote>
25482 Negators 20.7.11 [negators]:
25487 -1- Negators <tt>not1</tt> and <tt>not2</tt> take a unary and a binary predicate,
25488 respectively, and return their complements (5.3.1).
25491 <pre>template <<del>class</del> <ins>AdaptableUnaryFunction</ins> P<del>redicate</del>>
25492 <ins>requires Predicate< P, P::argument_type ></ins>
25494 : public unary_function<<del>typename</del> P<del>redicate</del>::argument_type,bool> {
25496 <ins>unary_negate(const unary_negate & ) = default;</ins>
25497 <ins>unary_negate(unary_negate && );</ins>
25499 <ins>requires CopyConstructible< P ></ins>
25500 explicit unary_negate(const Predicate& pred);
25501 <ins>requires MoveConstructible< P >
25502 explicit unary_negate(Predicate && pred);</ins>
25504 bool operator()(const <del>typename</del> P<del>redicate</del>::argument_type& x) const;
25508 -2 <tt>operator()</tt> returns <tt>!pred(x)</tt>.
25511 <pre>template <class Predicate>
25512 unary_negate<Predicate> not1(const Predicate&amp; pred);
25513 <ins>template <class Predicate>
25514 unary_negate<Predicate> not1(Predicate&& pred);</ins>
25517 -3- <i>Returns:</i> <tt>unary_negate<Predicate>(pred)</tt>.
25520 <pre>template <<del>class</del> <ins>AdaptableBinaryFunction</ins> P<del>redicate</del> >
25521 <ins>requires Predicate< P, P::first_argument_type, P::second_argument_type ></ins>
25522 class binary_negate
25523 : public binary_function<<del>typename</del> P<del>redicate</del>::first_argument_type,
25524 <del>typename</del> P<del>redicate</del>::second_argument_type, bool> {
25526 <ins>biary_negate(const binary_negate & ) = default;</ins>
25527 <ins>binary_negate(binary_negate && );</ins>
25529 <ins>requires CopyConstructible< P ></ins>
25530 explicit binary_negate(const Predicate& pred);
25531 <ins>requires MoveConstructible< P >
25532 explicit binary_negate(const Predicate& pred);</ins>
25534 bool operator()(const <del>typename</del> P<del>redicate</del>::first_argument_type& x,
25535 const <del>typename</del> P<del>redicate</del>::second_argument_type& y) const;
25539 -4- <tt>operator()</tt> returns <tt>!pred(x,y)</tt>.
25542 <pre>template <class Predicate>
25543 binary_negate<Predicate> not2(const Predicate& pred);
25544 <ins>template <class Predicate>
25545 binary_negate<Predicate> not2(Predicate&& pred);</ins>
25549 -5- <i>Returns:</i> <tt>binary_negate<Predicate>(pred)</tt>.
25559 <h3><a name="1079"></a>1079. UK-265: <code>RandomAccessIterator</code>'s <code>operator-</code> has nonsensical effects clause</h3>
25560 <p><b>Section:</b> 24.2.6 [random.access.iterators] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
25561 <b>Submitter:</b> Doug Gregor <b>Opened:</b> 2009-03-20 <b>Last modified:</b> 2009-03-22</p>
25562 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#random.access.iterators">active issues</a> in [random.access.iterators].</p>
25563 <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>
25564 <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>
25565 <p><b>Discussion:</b></p>
25566 <p><b>Addresses UK 265</b></p>
25570 This effects clause is nonesense. It looks more like an axiom stating
25571 equivalence, and certainly an effects clause cannot change the state of
25572 two arguments passed by const reference
25577 <p><b>Proposed resolution:</b></p>
25579 <p>Modify 24.2.6 [random.access.iterators]p7-9 as follows:</p>
25581 <blockquote><pre>difference_type operator-(const X& a, const X& b);
25584 <li><i>Precondition</i>: there exists a value <code>n</code> of
25585 <code>difference_type</code> such that <code>a == b + n</code>.</li>
25586 <li><del><i>Effects</i>: <code>b == a + (b - a)</code></del></li>
25587 <li><i>Returns</i>: <del><code>(a < b) ? distance(a,b) :
25588 -distance(b,a)</code></del><ins><code>n</code></ins></li>
25597 <h3><a name="1088"></a>1088. Response to UK 342</h3>
25598 <p><b>Section:</b> 30.6.4 [futures.promise] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
25599 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-03-22 <b>Last modified:</b> 2009-03-22</p>
25600 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#futures.promise">active issues</a> in [futures.promise].</p>
25601 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#futures.promise">issues</a> in [futures.promise].</p>
25602 <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>
25603 <p><b>Discussion:</b></p>
25604 <p><b>Addresses UK 342</b></p>
25607 <tt>std::promise</tt> is missing a non-member overload of <tt>swap</tt>. This is
25608 inconsistent with other types that provide a <tt>swap</tt> member function.
25612 Add a non-member overload <tt>void swap(promise&& x,promise&& y){ x.swap(y); }</tt>
25620 Create an issue. Move to review, attention: Howard. Detlef will also
25625 Post Summit Daniel provided wording.
25630 <p><b>Proposed resolution:</b></p>
25634 In 30.6.4 [futures.promise], before p.1, immediately after class template
25637 <blockquote><pre><ins>
25638 template <class R>
25639 void swap(promise<R>& x, promise<R>& y);
25641 </pre></blockquote>
25645 Change 30.6.4 [futures.promise]/10 as indicated (to fix a circular definition):
25649 -10- <i>Effects:</i> <del>swap(*this, other)</del><ins>Swaps the associated state
25650 of <tt>*this</tt> and <tt>other</tt></ins>
25653 <ins><i>Throws:</i> Nothing.</ins>
25659 After the last paragraph in 30.6.4 [futures.promise] add the following
25660 prototype description:
25662 <blockquote><pre><ins>
25663 template <class R>
25664 void swap(promise<R>& x, promise<R>& y);
25668 <ins><i>Effects:</i> <tt>x.swap(y)</tt></ins>
25671 <ins><i>Throws:</i> Nothing.</ins>
25685 <h3><a name="1089"></a>1089. Response to JP 76</h3>
25686 <p><b>Section:</b> 30 [thread] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
25687 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-03-22 <b>Last modified:</b> 2009-08-02</p>
25688 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread">issues</a> in [thread].</p>
25689 <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>
25690 <p><b>Discussion:</b></p>
25691 <p><b>Addresses JP 76</b></p>
25694 A description for "Throws: Nothing." are not unified.
25698 At the part without throw, "Throws: Nothing." should be described.
25702 Add "Throws: Nothing." to the following.
25707 30.3.1.6 [thread.thread.static] p1
25710 30.4.3.1 [thread.lock.guard] p4
25713 30.4.3.2.1 [thread.lock.unique.cons] p6
25716 30.5.1 [thread.condition.condvar] p7 and p8
25719 30.5.2 [thread.condition.condvarany] p6, p7, p19, p21 and p25
25732 Post Summit: Editor declares this non-editorial.
25737 2009-08-01 Howard provided wording:
25744 The definition of "<i>Throws:</i> Nothing." that I added is probably going to
25745 be controversial, but I beg you to consider it seriously.
25750 In C++ there are three "flow control" options for a function:
25755 It can return, either with a value, or with <tt>void</tt>.
25758 It can call a function which never returns, such as <tt>std::exit</tt> or
25759 <tt>std::terminate</tt>.
25762 It can throw an exception.
25766 The above list can be abbreviated with:
25769 <li><b>R</b>eturns.</li>
25770 <li><b>E</b>nds program.</li>
25771 <li><b>T</b>hrows exception.</li>
25775 In general a function can have the behavior of any of these 3, or any combination
25776 of any of these three, depending upon run time data.
25786 <li><b>RET</b></li>
25790 A function with no throw spec, and no documentation, is in general a <b>RET</b>
25791 function. It may return, it may end the program, or it may throw. When we
25792 specify a function with an empty throw spec:
25795 <blockquote><pre>void f() throw();
25796 </pre></blockquote>
25799 We are saying that <tt>f()</tt> is an <b>RE</b> function: It may return or end
25800 the program, but it will not throw.
25804 I posit that there are very few places in the library half of the standard
25805 where we intend for functions to be able to end the program (call <tt>terminate</tt>).
25806 And none of those places where we do say <tt>terminate</tt> could be called,
25807 do we currently say "<i>Throws:</i> Nothing.".
25811 I believe that if we define "<i>Throws:</i> Nothing." to mean <b>R</b>,
25812 we will both clarify many, many places in the standard, <em>and</em> give us a
25813 good rationale for choosing between "<i>Throws:</i> Nothing." (<b>R</b>)
25814 and <tt>throw()</tt> (<b>RE</b>) in the future. Indeed, this may give us motivation
25815 to change several <tt>throw()</tt>s to "<i>Throws:</i> Nothing.".
25820 I did not add the following changes as JP 76 requested as I believe we want to
25821 allow these functions to throw:
25826 Add a paragraph under 30.4.3.1 [thread.lock.guard] p4:
25829 <blockquote><pre>explicit lock_guard(mutex_type& m);
25833 <i>Throws:</i> Nothing.
25838 Add a paragraph under 30.4.3.2.1 [thread.lock.unique.cons] p6:
25841 <blockquote><pre>explicit unique_lock(mutex_type& m);
25845 <i>Throws:</i> Nothing.
25850 Add a paragraph under 30.5.2 [thread.condition.condvarany] p19, p21 and p25:
25853 <blockquote><pre>template <class Lock, class Rep, class Period>
25854 bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time);
25858 <i>Throws:</i> Nothing.
25862 <blockquote><pre>template <class Lock, class Duration, class Predicate>
25863 bool wait_until(Lock& lock, const chrono::time_point<Clock, Duration>& rel_time, Predicate pred);
25867 <i>Throws:</i> Nothing.
25871 <blockquote><pre>template <class Lock, class Rep, class Period, class Predicate>
25872 bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred);
25876 <i>Throws:</i> Nothing.
25888 <p><b>Proposed resolution:</b></p>
25890 Add a paragraph after 17.5.1.4 [structure.specifications] p4:
25895 -3- Descriptions of function semantics contain the following elements
25896 (as appropriate):<sup>158</sup>
25901 <i>Throws:</i> any exceptions thrown by the function, and the conditions
25902 that would cause the exception
25908 -4- For non-reserved replacement and handler functions, ...
25912 A "<i>Throws:</i> Nothing." element indicates that the function shall
25913 return ordinarily, and not via an exception. This element also
25914 indicates that the function <em>shall</em> return. [<i>Note:</i> This
25915 differs from an empty throw specification which may cause a function to
25916 call <tt>unexpected</tt> and subsequently <tt>terminate</tt>. —
25922 Add a paragraph under 30.3.1.6 [thread.thread.static] p1:
25925 <blockquote><pre>unsigned hardware_concurrency();
25929 -1- <i>Returns:</i> ...
25933 <i>Throws:</i> Nothing.
25938 Add a paragraph under 30.5.1 [thread.condition.condvar] p7 and p8:
25943 <i>[Informational, not to be incluced in the WP: The POSIX spec allows only:</i>
25946 <dt><i>[EINVAL]</i></dt>
25947 <dd><i>The value <tt>cond</tt> does not refer to an initialized condition variable. — end informational]</i></dd>
25950 <pre>void notify_one();
25954 -7- <i>Effects:</i> ...
25958 <i>Throws:</i> Nothing.
25962 <blockquote><pre>void notify_all();
25966 -8- <i>Effects:</i> ...
25970 <i>Throws:</i> Nothing.
25976 Add a paragraph under 30.5.2 [thread.condition.condvarany] p6 and p7:
25980 <pre>void notify_one();
25984 -6- <i>Effects:</i> ...
25988 <i>Throws:</i> Nothing.
25992 <blockquote><pre>void notify_all();
25996 -7- <i>Effects:</i> ...
26000 <i>Throws:</i> Nothing.
26011 <h3><a name="1090"></a>1090. Missing description of <tt>packaged_task</tt> member <tt>swap</tt>, missing non-member <tt>swap</tt></h3>
26012 <p><b>Section:</b> 30.6.7 [futures.task] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
26013 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2009-03-22 <b>Last modified:</b> 2009-05-24</p>
26014 <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>
26015 <p><b>Discussion:</b></p>
26017 Class template <tt>packaged_task</tt> in 30.6.7 [futures.task] shows a member <tt>swap</tt>
26018 declaration, but misses to
26019 document it's effects (No prototype provided). Further on this class
26020 misses to provide a non-member
26030 Alisdair notes that paragraph 2 of the proposed resolution has already been
26031 applied in the current Working Draft.
26034 We note a pending <tt>future</tt>-related paper by Detlef;
26035 we would like to wait for this paper before proceeding.
26043 2009-05-24 Daniel removed part 2 of the proposed resolution.
26048 <p><b>Proposed resolution:</b></p>
26052 In 30.6.7 [futures.task], immediately after the definition of class
26053 template packaged_task add:
26055 <blockquote><pre><ins>
26056 template<class R, class... Argtypes>
26057 void swap(packaged_task<R(ArgTypes...)>&, packaged_task<R(ArgTypes...)>&);
26059 </pre></blockquote>
26066 In 30.6.7 [futures.task], immediately after <tt>operator=</tt> prototype
26067 description (After p. 8) add:
26069 <blockquote><pre><ins>void swap(packaged_task& other);</ins>
26073 <i>Effects:</i> Swaps the associated state of <tt>*this</tt> and <tt>other</tt>.
26076 <i>Throws:</i> Nothing.
26083 At the end of 30.6.7 [futures.task] (after p. 20), add add the following
26084 prototype description:
26087 <blockquote><pre><ins>
26088 template<class R, class... Argtypes>
26089 void swap(packaged_task<R(ArgTypes...)>& x, packaged_task<R(ArgTypes...)>& y);
26093 <i>Effects:</i> <tt>x.swap(y)</tt>
26096 <i>Throws:</i> Nothing.
26108 <h3><a name="1091"></a>1091. Multimap description confusing</h3>
26109 <p><b>Section:</b> 23.4.2.2 [multimap.modifiers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
26110 <b>Submitter:</b> LWG <b>Opened:</b> 2009-03-22 <b>Last modified:</b> 2009-07-04</p>
26111 <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>
26112 <p><b>Discussion:</b></p>
26114 <p><b>Addresses UK 246</b></p>
26116 The content of this sub-clause is purely trying to describe in words the
26117 effect of the requires clauses on these operations, now that we have
26118 Concepts. As such, the description is more confusing than the signature
26119 itself. The semantic for these functions is adequately covered in the
26120 requirements tables in 23.2.4 [associative.reqmts].
26129 Pete is clearly right that
26130 this one is technical rather than editorial.
26139 We agree with the proposed resolution.
26147 <p><b>Proposed resolution:</b></p>
26149 Strike 23.4.2.2 [multimap.modifiers] entirely
26150 (but do NOT strike these signatures from the class template definition!).
26158 <h3><a name="1093"></a>1093. Multiple definitions for random_shuffle algorithm</h3>
26159 <p><b>Section:</b> 25.4.12 [alg.random.shuffle] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
26160 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-03-22 <b>Last modified:</b> 2009-07-28</p>
26161 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#alg.random.shuffle">issues</a> in [alg.random.shuffle].</p>
26162 <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>
26163 <p><b>Discussion:</b></p>
26166 There are a couple of issues with the declaration of the <tt>random_shuffle</tt>
26167 algorithm accepting a random number engine.
26172 The Iterators must be shuffle iterators, yet this requirement is missing.
26175 The <tt>RandomNumberEngine</tt> concept is now provided by the random number
26177 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2836.pdf">n2836</a>)
26178 and the placeholder should be removed.
26183 2009-05-02 Daniel adds:
26189 this issue completes adding necessary requirement to the
26190 third new <tt>random_shuffle</tt> overload. The current suggestion is:
26193 <blockquote><pre>template<RandomAccessIterator Iter, UniformRandomNumberGenerator Rand>
26194 requires ShuffleIterator<Iter>
26195 void random_shuffle(Iter first, Iter last, Rand&& g);
26196 </pre></blockquote>
26199 IMO this is still insufficient and I suggest to add the requirement
26201 <blockquote><pre>Convertible<Rand::result_type, Iter::difference_type>
26202 </pre></blockquote>
26204 to the list (as the two other overloads already have).
26213 Its true that this third overload is somewhat different from the remaining
26214 two. Nevertheless we know from <tt>UniformRandomNumberGenerator</tt>, that
26215 it's <tt>result_type</tt> is an integral type and that it satisfies
26216 <tt>UnsignedIntegralLike<result_type></tt>.
26219 To realize it's designated task, the algorithm has to invoke the
26220 <tt>Callable</tt> aspect of <tt>g</tt> and needs to perform some algebra involving
26221 it's <tt>min()/max()</tt> limits to compute another index value that
26222 at this point is converted into <tt>Iter::difference_type</tt>. This is so,
26223 because 24.2.6 [random.access.iterators] uses this type as argument
26224 of it's algebraic operators. Alternatively consider the equivalent
26225 iterator algorithms in 24.4 [iterator.operations] with the same result.
26228 This argument leads us to the conclusion that we also need
26229 <tt>Convertible<Rand::result_type, Iter::difference_type></tt> here.
26241 Alisdair notes that point (ii) has already been addressed.
26244 We agree with the proposed resolution to point (i)
26245 with Daniel's added requirement.
26253 2009-06-05 Daniel updated proposed wording as recommended in Batavia.
26258 2009-07-28 Alisdair adds:
26263 Revert to Open, with a note there is consensus on direction but the
26264 wording needs updating to reflect removal of concepts.
26268 <p><b>Proposed resolution:</b></p>
26270 Change in 25.2 [algorithms.syn] and 25.4.12 [alg.random.shuffle]:
26273 <blockquote><pre><del>concept UniformRandomNumberGenerator<typename Rand> { }</del>
26274 template<RandomAccessIterator Iter, UniformRandomNumberGenerator Rand>
26275 <ins>requires ShuffleIterator<Iter> &&
26276 Convertible<Rand::result_type, Iter::difference_type></ins>
26277 void random_shuffle(Iter first, Iter last, Rand&& g);
26278 </pre></blockquote>
26286 <h3><a name="1094"></a>1094. Response to JP 65 and JP 66</h3>
26287 <p><b>Section:</b> 27.5.4.3 [iostate.flags] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
26288 <b>Submitter:</b> P.J. Plauger <b>Opened:</b> 2009-03-24 <b>Last modified:</b> 2009-05-23</p>
26289 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#iostate.flags">issues</a> in [iostate.flags].</p>
26290 <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>
26291 <p><b>Discussion:</b></p>
26292 <p><b>Addresses JP 65 and JP 66</b></p>
26295 Switch from "unspecified-bool-type" to "explicit operator bool() const".
26299 Replace <tt>operator unspecified-bool-type() const;</tt>" with <tt>explicit operator bool() const;</tt>
26307 We agree with the proposed resolution.
26312 <p><b>Proposed resolution:</b></p>
26314 Change the synopis in 27.5.4 [ios]:
26317 <blockquote><pre><ins>explicit</ins> operator <del><i>unspecified-bool-type</i></del> <ins>bool</ins>() const;
26318 </pre></blockquote>
26321 Change 27.5.4.3 [iostate.flags]:
26324 <blockquote><pre><ins>explicit</ins> operator <del><i>unspecified-bool-type</i></del> <ins>bool</ins>() const;
26329 -1- <i>Returns:</i> <ins><tt>!fail()</tt></ins> <del>If <tt>fail()</tt> then a value that will evaluate
26330 false in a boolean context; otherwise a value that will evaluate true in
26331 a boolean context. The value type returned shall not be convertible to
26335 <del>[<i>Note:</i> This conversion can be used in contexts where a bool is expected
26336 (e.g., an <tt>if</tt> condition); however, implicit conversions (e.g.,
26337 to <tt>int</tt>) that can occur with <tt>bool</tt> are not allowed,
26338 eliminating some sources of user error. One possible implementation
26339 choice for this type is pointer-to-member. <i>-- end note</i>]</del>
26351 <h3><a name="1095"></a>1095. <i>Shared objects and the library</i> wording unclear</h3>
26352 <p><b>Section:</b> 17.6.3.10 [res.on.objects] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
26353 <b>Submitter:</b> Beman Dawes <b>Opened:</b> 2009-03-27 <b>Last modified:</b> 2009-05-23</p>
26354 <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>
26355 <p><b>Discussion:</b></p>
26357 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2775.htm">N2775</a>,
26358 <i>Small library thread-safety revisions</i>, among other changes, removed a note from
26359 17.6.3.10 [res.on.objects] that read:
26363 [<i>Note:</i> This prohibition against concurrent non-const access means that
26364 modifying an object of a standard library type shared between threads
26365 without using a locking mechanism may result in a data race. <i>--end note</i>.]
26369 That resulted in wording which is technically correct but can only be
26370 understood by reading the lengthy and complex 17.6.4.7 [res.on.data.races]
26371 Data race avoidance. This has the effect of making
26372 17.6.3.10 [res.on.objects] unclear, and has already resulted in a query
26373 to the LWG reflector. See c++std-lib-23194.
26382 The proposed wording seems to need a bit of tweaking
26383 ("really bad idea" isn't quite up to standardese).
26384 We would like feedback
26385 as to whether the original Note's removal was intentional.
26388 Change the phrase "is a really bad idea"
26389 to "risks undefined behavior" and
26390 move to Review status.
26395 <p><b>Proposed resolution:</b></p>
26397 Change 17.6.3.10 [res.on.objects] as indicated:
26402 The behavior of a program is undefined if calls to standard library
26403 functions from different threads may introduce a data race. The
26404 conditions under which this may occur are specified in 17.6.4.7.
26407 [<i>Note:</i> Thus modifying an object of a standard library type shared between
26408 threads risks undefined behavior unless objects of the type are explicitly
26409 specified as being sharable without data races or the user supplies a
26410 locking mechanism. <i>--end note</i>]
26419 <h3><a name="1097"></a>1097. #define __STDCPP_THREADS</h3>
26420 <p><b>Section:</b> 18.2 [support.types] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
26421 <b>Submitter:</b> Jens Maurer <b>Opened:</b> 2009-04-03 <b>Last modified:</b> 2009-05-23</p>
26422 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#support.types">issues</a> in [support.types].</p>
26423 <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>
26424 <p><b>Discussion:</b></p>
26425 <p><b>Addresses DE 18</b></p>
26428 Freestanding implementations do not (necessarily) have
26429 support for multiple threads (see 1.10 [intro.multithread]).
26430 Applications and libraries may want to optimize for the
26431 absence of threads. I therefore propose a preprocessor
26432 macro to indicate whether multiple threads can occur.
26436 There is ample prior implementation experience for this
26437 feature with various spellings of the macro name. For
26438 example, gcc implicitly defines <tt>_REENTRANT</tt>
26439 if multi-threading support is selected on the compiler
26444 While this is submitted as a library issue, it may be more
26445 appropriate to add the macro in 16.8 cpp.predefined in the
26451 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2693.html">N2693</a>.
26460 We agree with the issue, and believe it is properly a library issue.
26463 We prefer that the macro be conditionally defined
26464 as part of the <tt><thread></tt> header.
26472 <p><b>Proposed resolution:</b></p>
26474 Insert a new subsection before 18.2 [support.types], entitled
26475 "Feature Macros" (support.macros):
26479 The standard library defines the following macros; no explicit
26480 prior inclusion of any header file is necessary.
26484 <dt><tt>__STDCPP_THREADS</tt></dt>
26486 The macro <tt>__STDCPP_THREADS</tt> shall be defined if and only if a
26487 program can have more than one thread of execution (1.10 [intro.multithread]).
26488 If the macro is defined, it shall have the same
26489 value as the predefined macro <tt>__cplusplus</tt> (16.8 [cpp.predefined]).
26501 <h3><a name="1098"></a>1098. definition of get_pointer_safety()</h3>
26502 <p><b>Section:</b> 20.8.10.7 [util.dynamic.safety] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
26503 <b>Submitter:</b> Jens Maurer <b>Opened:</b> 2009-04-03 <b>Last modified:</b> 2009-05-23</p>
26504 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#util.dynamic.safety">issues</a> in [util.dynamic.safety].</p>
26505 <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>
26506 <p><b>Discussion:</b></p>
26507 <p><b>Addresses DE 18</b></p>
26510 In 20.8.10.7 [util.dynamic.safety], <tt>get_pointer_safety()</tt> purports
26511 to define behavior for
26512 non-safely derived pointers (3.7.4.3 [basic.stc.dynamic.safety]). However,
26513 the cited core-language section in paragraph 4 specifies undefined behavior
26514 for the use of such pointer values. This seems an unfortunate near-contradiction.
26515 I suggest to specify the term <i>relaxed pointer safety</i> in
26516 the core language section and refer to it from the library description.
26517 This issue deals with the library part, the corresponding core issue (c++std-core-13940)
26518 deals with the core modifications.
26523 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2693.html">N2693</a>.
26532 We recommend if this issue is to be moved,
26533 the issue be moved concurrently with the cited Core issue.
26536 We agree with the intent of the proposed resolution.
26537 We would like input from garbage collection specialists.
26546 <p><b>Proposed resolution:</b></p>
26548 In 20.8.10.7 [util.dynamic.safety] p16, replace the description of
26549 <tt>get_pointer_safety()</tt> with:
26554 <tt>pointer_safety get_pointer_safety();</tt>
26558 <del><i>Returns:</i> an enumeration value indicating the implementation's treatment
26559 of pointers that are not safely derived (3.7.4.3). Returns
26560 <tt>pointer_safety::relaxed</tt> if pointers that are not safely derived will be
26561 treated the same as pointers that are safely derived for the duration of
26562 the program. Returns <tt>pointer_safety::preferred</tt> if pointers that are not
26563 safely derived will be treated the same as pointers that are safely
26564 derived for the duration of the program but allows the implementation to
26565 hint that it could be desirable to avoid dereferencing pointers that are
26566 not safely derived as described. [<i>Example:</i> <tt>pointer_safety::preferred</tt>
26567 might be returned to detect if a leak detector is running to avoid
26568 spurious leak reports. -- <i>end note</i>] Returns <tt>pointer_safety::strict</tt> if
26569 pointers that are not safely derived might be treated differently than
26570 pointers that are safely derived.</del>
26573 <i>Returns:</i> Returns <tt>pointer_safety::strict</tt> if the implementation has
26574 strict pointer safety (3.7.4.3 [basic.stc.dynamic.safety]). It is
26575 implementation-defined whether <tt>get_pointer_safety</tt> returns
26576 <tt>pointer_safety::relaxed</tt> or <tt>pointer_safety::preferred</tt> if the
26577 implementation has relaxed pointer safety
26578 (3.7.4.3 [basic.stc.dynamic.safety]).<sup>Footnote</sup>
26582 <i>Throws:</i> nothing
26586 Footnote) <tt>pointer_safety::preferred</tt> might be returned to indicate to the
26587 program that a leak detector is running so that the program can avoid
26588 spurious leak reports.
26600 <h3><a name="1099"></a>1099. Various issues</h3>
26601 <p><b>Section:</b> 17 [library] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
26602 <b>Submitter:</b> David Abrahams <b>Opened:</b> 2009-03-21 <b>Last modified:</b> 2009-05-23</p>
26603 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#library">active issues</a> in [library].</p>
26604 <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>
26605 <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>
26606 <p><b>Discussion:</b></p>
26612 [2009-03-21 Sat] p. 535 at the top we need MoveConstructible V1,
26613 MoveConstructible V2 (where V1,V2 are defined on 539). Also make_tuple
26617 [2009-03-21 Sat] p1183 thread ctor, and in general, we need a way to
26618 talk about "copiable from generalized rvalue ref argument" for cases
26619 where we're going to forward and copy.
26623 This issue may well be quite large. Language in para 4 about "if
26624 an lvalue" is wrong because types aren't expressions.
26627 p1199, call_once has all the same issues.
26631 [2009-03-21 Sat] p869 InputIterator pointer type should not be required
26632 to be convertible to const value_type*, rather it needs to have a
26633 operator-> of its own that can be used for the value type.
26636 [2009-03-21 Sat] p818 stack has the same problem with default ctor.
26639 [2009-03-21 Sat] p816 priority_queue has the same sorts of problems as queue, only more so
26641 <blockquote><pre> requires MoveConstructible<Cont>
26642 explicit priority_queue(const Compare& x = Compare(), Cont&& = Cont());
26645 Don't require MoveConstructible when default constructing Cont.
26646 Also missing semantics for move ctor.
26650 [2009-03-21 Sat] Why are Allocators required to be CopyConstructible as
26651 opposed to MoveConstructible?
26654 [2009-03-21 Sat] p813 queue needs a separate default ctor (Cont needn't
26655 be MoveConstructible). No documented semantics for move c'tor. Or
26656 *any* of its 7 ctors!
26659 [2009-03-21 Sat] std::array should have constructors for C++0x,
26660 consequently must consider move construction.
26664 2009-05-01 Daniel adds:
26669 This could be done as part of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1035">1035</a>, which already handles
26670 deviation of <tt>std::array</tt> from container tables.
26674 [2009-03-21 Sat] p622 all messed up.
26678 para 8 "implementation-defined" is the wrong term; should be "see
26679 below" or something.
26682 para 12 "will be selected" doesn't make any sense because we're not
26683 talking about actual arg types.
26686 paras 9-13 need to be totally rewritten for concepts.
26691 [2009-03-21 Sat] Null pointer comparisons (p587) have all become
26692 unconstrained. Need to fix that
26695 [2009-03-21 Sat] mem_fun_t etc. definition doesn't match declaration.
26696 We think CopyConstructible is the right reqt.
26699 make_pair needs Constructible<V1, T1&&> requirements!
26702 make_tuple needs something similar
26705 tuple bug in synopsis:
26707 <blockquote><pre> template <class... UTypes>
26708 requires Constructible<Types, const UTypes&>...
26709 template <class... UTypes>
26710 requires Constructible<Types, RvalueOf<UTypes>::type>...
26713 Note: removal of MoveConstructible requirements in std::function makes
26714 these routines unconstrained!
26719 2009-05-02 Daniel adds:
26724 This part of the issue is already covered by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1077">1077</a>.
26728 these unique_ptr constructors are broken [ I think this is covered in "p622 all messed up" ]
26730 <blockquote><pre> unique_ptr(pointer p, implementation-defined d);
26731 unique_ptr(pointer p, implementation-defined d);
26732 </pre></blockquote>
26734 multimap range constructor should not have MoveConstructible<value_type> requirement.
26737 same with insert(..., P&&); multiset has the same issue, as do
26738 unordered_multiset and unordered_multimap. Review these!
26748 Move to Open, pending proposed wording from Dave for further review.
26752 <p><b>Proposed resolution:</b></p>
26761 <h3><a name="1100"></a>1100. <tt>auto_ptr</tt> to <tt>unique_ptr</tt> conversion</h3>
26762 <p><b>Section:</b> 20.8.9.2.1 [unique.ptr.single.ctor] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
26763 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-04-25 <b>Last modified:</b> 2009-08-01</p>
26764 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unique.ptr.single.ctor">active issues</a> in [unique.ptr.single.ctor].</p>
26765 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unique.ptr.single.ctor">issues</a> in [unique.ptr.single.ctor].</p>
26766 <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>
26767 <p><b>Discussion:</b></p>
26769 Message c++std-lib-23182 led to a discussion in which several people
26770 expressed interest in being able to convert an <tt>auto_ptr</tt> to a
26771 <tt>unique_ptr</tt> without the need to call <tt>release</tt>. Below is
26772 wording to accomplish this.
26781 Pete believes it not a good idea to separate parts of a class's definition.
26782 Therefore, if we do this,
26783 it should be part of <tt>unique-ptr</tt>'s specification.
26786 Alisdair believes the lvalue overload may be not necessary.
26789 Marc believes it is more than just sugar,
26790 as it does ease the transition to <tt>unique-ptr</tt>.
26793 We agree with the resolution as presented.
26794 Move to Tentatively Ready.
26804 Moved from Tentatively Ready to Open only because the wording needs to be
26805 tweaked for concepts removal.
26809 2009-08-01 Howard deconceptifies wording:
26814 I also moved the change from D.9 [depr.auto.ptr]
26815 to 20.8.9.2 [unique.ptr.single] per the Editor's request
26816 in Batavia (as long as I was making changes anyway). Set back
26822 <p><b>Proposed resolution:</b></p>
26824 Add to 20.8.9.2 [unique.ptr.single]:
26827 <blockquote><pre>template <class T, class D>
26831 <ins> template <class U>
26832 unique_ptr(auto_ptr<U>& u);
26833 template <class U>
26834 unique_ptr(auto_ptr<U>&& u);</ins>
26836 </pre></blockquote>
26839 Add to 20.8.9.2.1 [unique.ptr.single.ctor]:
26842 <blockquote><pre>template <class U>
26843 unique_ptr(auto_ptr<U>& u);
26844 template <class U>
26845 unique_ptr(auto_ptr<U>&& u);
26849 <i>Effects:</i> Constructs a <tt>unique_ptr</tt> with <tt>u.release()</tt>.
26853 <i>Postconditions:</i> <tt>get() == </tt> the value <tt>u.get()</tt> had before
26854 the construciton, modulo any required offset adjustments resulting from the cast from
26855 <tt>U*</tt> to <tt>T*</tt>. <tt>u.get() == nullptr</tt>.
26859 <i>Throws:</i> nothing.
26863 <i>Remarks:</i> <tt>U*</tt> shall be implicitly convertible to <tt>T*</tt> and
26864 <tt>D</tt> shall be the same type as <tt>default_delete<T></tt>, else these
26865 constructors shall not participate in overload resolution.
26876 <h3><a name="1102"></a>1102. <tt>std::vector</tt>'s reallocation policy still unclear</h3>
26877 <p><b>Section:</b> 23.3.6.2 [vector.capacity] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
26878 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2009-04-20 <b>Last modified:</b> 2009-05-23</p>
26879 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#vector.capacity">issues</a> in [vector.capacity].</p>
26880 <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>
26881 <p><b>Discussion:</b></p>
26883 I have the impression that even the wording of current draft
26884 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2857.pdf">N2857</a>
26885 does insufficiently express the intent of <tt>vector</tt>'s
26886 reallocation strategy. This has produced not too old library
26887 implementations which release memory in the <tt>clear()</tt> function
26888 and even modern articles about C++ programming cultivate
26889 the belief that <tt>clear</tt> is allowed to do exactly this. A typical
26890 example is something like this:
26893 <blockquote><pre>const int buf_size = ...;
26894 std::vector<T> buf(buf_size);
26895 for (int i = 0; i < some_condition; ++i) {
26896 buf.resize(buf_size);
26897 write_or_read_data(buf.data());
26898 buf.clear(); // Ensure that the next round get's 'zeroed' elements
26900 </pre></blockquote>
26902 where still the myth is ubiquitous that <tt>buf</tt> might be
26903 allowed to reallocate it's memory *inside* the <tt>for</tt> loop.
26906 IMO the problem is due to the fact, that
26911 the actual memory-reallocation stability of <tt>std::vector</tt>
26912 is explained in 23.3.6.2 [vector.capacity]/3 and /6 which
26913 are describing just the effects of the <tt>reserve</tt>
26914 function, but in many examples (like above) there
26915 is no explicit call to <tt>reserve</tt> involved. Further-more
26916 23.3.6.2 [vector.capacity]/6 does only mention <em>insertions</em>
26917 and never mentions the consequences of erasing
26922 the effects clause of <tt>std::vector</tt>'s <tt>erase</tt> overloads in
26923 23.3.6.4 [vector.modifiers]/4 is silent about capacity changes. This
26924 easily causes a misunderstanding, because the counter
26925 parting insert functions described in 23.3.6.4 [vector.modifiers]/2
26926 explicitly say, that
26929 Causes reallocation if the new size is greater than the
26930 old capacity. If no reallocation happens, all the iterators
26931 and references before the insertion point remain valid.
26934 It requires a complex argumentation chain about four
26935 different places in the standard to provide the - possibly
26936 weak - proof that calling <tt>clear()</tt> also does <em>never</em> change
26937 the capacity of the <tt>std::vector</tt> container. Since <tt>std::vector</tt>
26938 is the de-facto replacement of C99's dynamic arrays this
26939 type is near to a built-in type and it's specification should
26940 be clear enough that usual programmers can trust their
26952 Bill believes paragraph 1 of the proposed resolution is unnecessary
26953 because it is already implied (even if tortuously) by the current wording.
26961 <p><b>Proposed resolution:</b></p>
26963 This is a minimum version. I also
26964 suggest that the wording explaining the allocation strategy
26965 of <tt>std::vector</tt> in 23.3.6.2 [vector.capacity]/3 and /6 is moved into
26966 a separate sub paragraph of 23.3.6.2 [vector.capacity] <em>before</em>
26967 any of the prototype's are discussed, but I cannot provide
26968 reasonable wording changes now
26975 Change 23.3.6.2 [vector.capacity]/6 as follows:
26978 It is guaranteed that no reallocation takes place during
26979 insertions <ins>or erasures</ins> that happen after a call
26980 to <tt>reserve()</tt> until the time when an insertion would make
26981 the size of the vector greater than the value of <tt>capacity()</tt>.
26986 Change 23.3.6.4 [vector.modifiers]/4 as follows:
26989 <i>Effects:</i> <ins>The capacity shall remain unchanged and no reallocation shall
26991 Invalidates iterators and references at or after the point
27002 <h3><a name="1104"></a>1104. <tt>basic_ios::move</tt> should accept lvalues</h3>
27003 <p><b>Section:</b> 27.5.4.2 [basic.ios.members] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
27004 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-04-25 <b>Last modified:</b> 2009-05-23</p>
27005 <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>
27006 <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>
27007 <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>
27008 <p><b>Discussion:</b></p>
27010 With the rvalue reference changes in
27011 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html">N2844</a>
27012 <tt>basic_ios::move</tt> no longer has the most convenient signature:
27015 <blockquote><pre>void move(basic_ios&& rhs);
27016 </pre></blockquote>
27019 This signature should be changed to accept lvalues. It does not need to be
27020 overloaded to accept rvalues. This is a special case that only derived clients
27021 will see. The generic <tt>move</tt> still needs to accept rvalues.
27030 Tom prefers, on general principles, to provide both overloads.
27034 Howard points out that there is no backward compatibility issue
27035 as this is new to C++0X.
27038 We agree that both overloads should be provided,
27039 and Howard will provide the additional wording.
27045 2009-05-23 Howard adds:
27050 Added overload, moved to Review.
27055 <p><b>Proposed resolution:</b></p>
27057 Add a signature to the existing prototype in the synopsis of 27.5.4 [ios]
27058 and in 27.5.4.2 [basic.ios.members]:
27061 <blockquote><pre><ins>void move(basic_ios& rhs);</ins>
27062 void move(basic_ios&& rhs);
27063 </pre></blockquote>
27070 <h3><a name="1106"></a>1106. Multiple exceptions from connected <tt>shared_future::get()</tt>?</h3>
27071 <p><b>Section:</b> 30.6.6 [future.shared_future] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
27072 <b>Submitter:</b> Thomas J. Gritzan <b>Opened:</b> 2009-04-03 <b>Last modified:</b> 2009-05-23</p>
27073 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#future.shared_future">active issues</a> in [future.shared_future].</p>
27074 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#future.shared_future">issues</a> in [future.shared_future].</p>
27075 <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>
27076 <p><b>Discussion:</b></p>
27078 It is not clear, if multiple threads are waiting in a
27079 <tt>shared_future::get()</tt> call, if each will rethrow the stored exception.
27085 <i>Throws:</i> the stored exception, if an exception was stored and not
27089 The "not retrieved before" suggests that only one exception is thrown,
27090 but one exception for each call to <tt>get()</tt> is needed, and multiple calls
27091 to <tt>get()</tt> even on the same <tt>shared_future</tt> object seem to be allowed.
27094 I suggest removing "and not retrieved before" from the Throws paragraph.
27095 I recommend adding a note that explains that multiple calls on <tt>get()</tt> are
27096 allowed, and each call would result in an exception if an exception was
27106 We note there is a pending paper by Detlef
27107 on such <tt>future</tt>-related issues;
27108 we would like to wait for his paper before proceeding.
27111 Alisdair suggests we may want language to clarify that this
27112 <tt>get()</tt> function can be called from several threads
27113 with no need for explicit locking.
27121 <p><b>Proposed resolution:</b></p>
27123 Change 30.6.6 [future.shared_future]:
27126 <blockquote><pre>const R& shared_future::get() const;
27127 R& shared_future<R&>::get() const;
27128 void shared_future<void>::get() const;
27133 -9- <i>Throws:</i> the stored exception, if an exception was stored<del> and not retrieved before</del>.
27135 [<i>Note:</i> Multiple calls on <tt>get()</tt> are
27136 allowed, and each call would result in an exception if an exception was
27137 stored. — <i>end note</i>]
27149 <h3><a name="1108"></a>1108. thread.req.exception overly constrains implementations</h3>
27150 <p><b>Section:</b> 30.2.2 [thread.req.exception] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
27151 <b>Submitter:</b> Christopher Kohlhoff <b>Opened:</b> 2009-04-25 <b>Last modified:</b> 2009-05-23</p>
27152 <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>
27153 <p><b>Discussion:</b></p>
27155 The current formulation of 30.2.2 [thread.req.exception]/2 reads:
27158 The error_category of the <tt>error_code</tt> reported by such an
27159 exception's <tt>code()</tt> member function is as specified in the error
27163 This constraint on the code's associated <tt>error_categor</tt> means an
27164 implementation must perform a mapping from the system-generated
27165 error to a <tt>generic_category()</tt> error code. The problems with this
27171 The mapping is always performed, even if the resultant value is
27176 The original error produced by the operating system is lost.
27181 The latter was one of Peter Dimov's main objections (in a private
27182 email discussion) to the original <tt>error_code</tt>-only design, and led to
27183 the creation of <tt>error_condition</tt> in the first place. Specifically,
27184 <tt>error_code</tt> and <tt>error_condition</tt> are intended to perform the following
27189 <tt>error_code</tt> holds the original error produced by the operating
27193 <tt>error_condition</tt> and the generic category provide a set of well
27194 known error constants that error codes may be tested against.
27198 Any mapping determining correspondence of the returned error code to
27199 the conditions listed in the error condition clause falls under the
27200 "latitude" granted to implementors in 19.5.1.5 [syserr.errcat.objects].
27201 (Although obviously their latitude is restricted a little by the
27202 need to match the right error condition when returning an error code
27203 from a library function.)
27206 It is important that this <tt>error_code/error_condition</tt> usage is done
27207 correctly for the thread library since it is likely to set the
27208 pattern for future TR libraries that interact with the operating
27217 Move to Open, and recommend the issue be deferred until after the next
27218 Committee Draft is issued.
27222 <p><b>Proposed resolution:</b></p>
27224 Change 30.2.2 [thread.req.exception]/2:
27229 -2- <del>The <tt>error_category</tt> (19.5.1.1) of the <tt>error_code</tt> reported by
27230 such an exception's <tt>code()</tt> member function
27231 is as specified in the error condition Clause.</del>
27233 The <tt>error_code</tt> reported by such an exception's <tt>code()</tt> member
27234 function shall compare equal to one of the conditions specified in
27235 the function's error condition Clause. [<i>Example:</i> When the thread
27239 <blockquote><pre><ins>
27240 ec.category() == implementation-defined // probably system_category
27241 ec == errc::resource_unavailable_try_again // holds true
27242 </ins></pre></blockquote>
27245 — <i>end example</i>]
27256 <h3><a name="1110"></a>1110. Is <tt>for_each</tt> overconstrained?</h3>
27257 <p><b>Section:</b> 25.3.4 [alg.foreach] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
27258 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-04-29 <b>Last modified:</b> 2009-05-23</p>
27259 <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>
27260 <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>
27261 <p><b>Discussion:</b></p>
27263 Quoting working paper for reference (25.3.4 [alg.foreach]):
27267 <pre>template<InputIterator Iter, Callable<auto, Iter::reference> Function>
27268 requires CopyConstructible<Function>
27269 Function for_each(Iter first, Iter last, Function f);
27273 1 Effects: Applies f to the result of dereferencing every iterator in the
27274 range [first,last), starting from first and proceeding to last - 1.
27280 3 Complexity: Applies f exactly last - first times.
27286 P2 implies the passed object <tt>f</tt> should be invoked at each stage, rather than
27287 some copy of <tt>f</tt>. This is important if the return value is to usefully
27288 accumulate changes. So the requirements are an object of type <tt>Function</tt> can
27289 be passed-by-value, invoked multiple times, and then return by value. In
27290 this case, <tt>MoveConstructible</tt> is sufficient. This would open support for
27291 move-only functors, which might become important in concurrent code as you
27292 can assume there are no other references (copies) of a move-only type and so
27293 freely use them concurrently without additional locks.
27297 See further discussion starting with c++std-lib-23686.
27307 Pete suggests we may want to look at this in a broader context
27308 involving other algorithms.
27309 We should also consider the implications of parallelism.
27312 Move to Open, and recommend the issue be deferred until after the next
27313 Committee Draft is issued.
27318 <p><b>Proposed resolution:</b></p>
27320 Change 25.2 [algorithms.syn] and 25.3.4 [alg.foreach]:
27323 <blockquote><pre>template<InputIterator Iter, Callable<auto, Iter::reference> Function>
27324 requires <del>CopyConstructible</del> <ins>MoveConstructible</ins><Function>
27325 Function for_each(Iter first, Iter last, Function f);
27326 </pre></blockquote>
27333 <h3><a name="1112"></a>1112. bitsets and new style for loop</h3>
27334 <p><b>Section:</b> 20.3.6 [template.bitset] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
27335 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-06 <b>Last modified:</b> 2009-07-25</p>
27336 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#template.bitset">active issues</a> in [template.bitset].</p>
27337 <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>
27338 <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>
27339 <p><b>Discussion:</b></p>
27341 <tt>Std::bitset</tt> is a homogeneous container-like sequence of bits, yet it does
27342 not model the Range concept so cannot be used with the new for-loop syntax.
27343 It is the only such type in the library that does NOT support the new for
27347 The obvious reason is that bitset does not support iterators.
27350 At least two reasonable solutions are available:
27354 Add an iterator interface to <tt>bitset</tt>, bringing its interface close to that
27355 of <tt>std::array</tt>
27358 Provide an unspecified concept_map for <tt>Range<bitset></tt>.
27362 The latter will still need some kind of iterator-like adapter for <tt>bitset</tt>,
27363 but gives implementers greater freedom on the details. E.g. begin/end return
27364 some type that simply invokes <tt>operator[]</tt> on the object it wraps, and
27365 increments its index on <tt>operator++</tt>. A vendor can settle for <tt>InputIterator</tt>
27366 support, rather than wrapping up a full <tt>RandomAccessIterator</tt>.
27369 I have a mild preference for option (ii) as I think it is less work to
27370 specify at this stage of the process, although (i) is probably more useful
27374 Hmm, my wording looks a little woolly, as it does not say what the element
27375 type of the range is. Do I get a range of <tt>bool</tt>, <tt>bitset<N>::reference</tt>, or
27376 something else entirely?
27379 I guess most users will assume the behaviour of reference, but expect to
27380 work with <tt>bool</tt>. <tt>Bool</tt> is OK for read-only traversal, but you really need to
27381 take a reference to a <tt>bitset::reference</tt> if you want to write back.
27390 We further recommend this be deferred until after the next Committee Draft.
27394 2009-05-25 Alisdair adds:
27400 I just stumbled over the <tt>Range concept_map</tt> for <tt>valarray</tt> and this should
27401 probably set the precedent on how to write the wording.
27405 Howard: I've replaced the proposed wording with Alisdair's suggestion.
27412 2009-07-24 Daniel modifies the proposed wording for non-concepts.
27418 <p><b>Proposed resolution:</b></p>
27422 Modify the section 20.3.6 [template.bitset] <tt><bitset></tt> synopsis by adding
27423 the following at the end of the synopsis:
27425 <blockquote><pre><ins>
27426 // XX.X.X bitset range access [bitset.range]
27427 template<size_t N> <i>unspecified-1</i> begin(bitset<N>&);
27428 template<size_t N> <i>unspecified-2</i> begin(const bitset<N>&);
27429 template<size_t N> <i>unspecified-1</i> end(bitset<N>&);
27430 template<size_t N> <i>unspecified-2</i> end(const bitset<N>&);
27432 </pre></blockquote>
27436 Add a new section <ins>"bitset range access" [bitset.range]</ins>
27437 after the current section 20.3.6.3 [bitset.operators] with the following series of
27443 1. In the <tt>begin</tt> and <tt>end</tt> function templates that follow, <i>unspecified-1</i>
27444 is a type that meets the requirements of a mutable random access
27445 iterator (24.2.6 [random.access.iterators]) whose <tt>value_type</tt> is <tt>bool</tt> and
27446 whose reference type is <tt>bitset<N>::reference</tt>.
27447 <i>unspecified-2</i> is a type that meets the requirements of a constant
27448 random access iterator (24.2.6 [random.access.iterators]) whose <tt>value_type</tt>
27449 is <tt>bool</tt> and whose reference type is <tt>bool</tt>.
27453 template<size_t N> <i>unspecified-1</i> begin(bitset<N>&);
27454 template<size_t N> <i>unspecified-2</i> begin(const bitset<N>&);
27458 <ins>2. Returns: an iterator referencing the first bit in the bitset.</ins>
27462 template<size_t N> <i>unspecified-1</i> end(bitset<N>&);
27463 template<size_t N> <i>unspecified-2</i> end(const bitset<N>&);
27467 <ins>3. Returns: an iterator referencing one past the last bit in the
27486 <h3><a name="1113"></a>1113. <tt>bitset::to_string</tt> could be simplified</h3>
27487 <p><b>Section:</b> 20.3.6 [template.bitset] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
27488 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-09 <b>Last modified:</b> 2009-05-23</p>
27489 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#template.bitset">active issues</a> in [template.bitset].</p>
27490 <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>
27491 <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>
27492 <p><b>Discussion:</b></p>
27494 In <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#853">853</a> our resolution is changing the signature by adding two
27495 defaulting arguments to 3 calls. In principle, this means that ABI breakage
27496 is not an issue, while API is preserved.
27499 With that observation, it would be very nice to use the new ability to
27500 supply default template parameters to function templates to collapse all 3
27501 signatures into 1. In that spirit, this issue offers an alternative resolution
27502 than that of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#853">853</a>.
27511 and look at the issue again after <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#853">853</a> has been accepted.
27512 We further recommend this be deferred until after the next Committee Draft.
27516 <p><b>Proposed resolution:</b></p>
27521 In 20.3.6 [template.bitset]/1 (class bitset) ammend:
27523 <blockquote><pre>template <class charT <ins>= char</ins>,
27524 class traits <ins>= char_traits<charT></ins>,
27525 class Allocator <ins>= allocator<charT></ins>>
27526 basic_string<charT, traits, Allocator>
27527 to_string(charT zero = charT('0'), charT one = charT('1')) const;
27528 <del>template <class charT, class traits>
27529 basic_string<charT, traits, allocator<charT> > to_string() const;
27530 template <class charT>
27531 basic_string<charT, char_traits<charT>, allocator<charT> > to_string() const;
27532 basic_string<char, char_traits<char>, allocator<char> > to_string() const;</del>
27533 </pre></blockquote>
27537 In 20.3.6.2 [bitset.members] prior to p35 ammend:
27539 <blockquote><pre>template <class charT <ins>= char</ins>,
27540 class traits <ins>= char_traits<charT></ins>,
27541 class Allocator <ins>= allocator<charT></ins>>
27542 basic_string<charT, traits, Allocator>
27543 to_string(charT zero = charT('0'), charT one = charT('1')) const;
27544 </pre></blockquote>
27547 Strike 20.3.6.2 [bitset.members] paragraphs 37 -> 39 (including signature
27558 <h3><a name="1114"></a>1114. Type traits underspecified</h3>
27559 <p><b>Section:</b> 20.6 [meta] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
27560 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2009-05-12 <b>Last modified:</b> 2009-05-23</p>
27561 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#meta">active issues</a> in [meta].</p>
27562 <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>
27563 <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>
27564 <p><b>Discussion:</b></p>
27567 Related to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#975">975</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1023">1023</a>.
27571 The current wording in 20.6.1 [meta.rqmts] is still unclear concerning
27572 it's requirements on the type traits classes regarding ambiguities.
27573 Specifically it's unclear
27578 if a predicate trait (20.6.4 [meta.unary], 20.6.5 [meta.rel]) could derive from both
27579 <tt>true_type</tt>/<tt>false_type</tt>.
27582 if any of the type traits (20.6.1 [meta.rqmts], 20.6.4 [meta.unary], 20.6.5 [meta.rel]) could ambiguously derive
27583 from the same specified result type.
27586 if any of the type traits (20.6.1 [meta.rqmts], 20.6.4 [meta.unary], 20.6.5 [meta.rel]) could derive from other
27587 <tt>integral_constant</tt> types making the contained names ambiguous
27590 if any of the type traits (20.6.1 [meta.rqmts], 20.6.4 [meta.unary], 20.6.5 [meta.rel]) could have other base
27591 classes that contain members hiding the name of the result type members
27592 or make the contained member names ambiguous.
27602 Alisdair would prefer to factor some of the repeated text,
27603 but modulo a corner case or two,
27604 he believes the proposed wording is otherwise substantially correct.
27612 <p><b>Proposed resolution:</b></p>
27614 The usage of the notion of a <i>BaseCharacteristic</i> below
27616 useful in other places - e.g. to define the base class relation in
27617 20.7.5 [refwrap], 20.7.15 [func.memfn], or 20.7.16.2 [func.wrap.func].
27618 In this case it's definition should probably
27619 be moved to Clause 17
27626 Change 20.6.1 [meta.rqmts]/1 as indicated:
27629 [..] It shall be <tt>DefaultConstructible</tt>, <tt>CopyConstructible</tt>, and publicly
27630 <ins>and unambiguously</ins> derived, directly or indirectly, from
27631 <ins>its <i>BaseCharacteristic</i>, which is</ins> a specialization of the
27632 template <tt>integral_constant</tt> (20.6.3), with the arguments to the template
27633 <tt>integral_constant</tt> determined by the requirements for the particular
27634 property being described. <ins>The member names of the
27635 <i>BaseCharacteristic</i> shall be unhidden and unambiguously
27636 available in the <i>UnaryTypeTrait</i>.</ins>
27641 Change 20.6.1 [meta.rqmts]/2 as indicated:
27644 [..] It shall be <tt>DefaultConstructible</tt>, <tt>CopyConstructible</tt>, and publicly
27645 <ins>and unambiguously</ins> derived, directly or indirectly, from
27646 <del>an instance</del> <ins>its <i>BaseCharacteristic</i>, which is a
27647 specialization</ins> of the template <tt>integral_constant</tt> (20.6.3), with
27648 the arguments to the template <tt>integral_constant</tt> determined by the
27649 requirements for the particular relationship being described. <ins>The
27650 member names of the <i>BaseCharacteristic</i> shall be unhidden
27651 and unambiguously available in the <i>BinaryTypeTrait</i>.</ins>
27656 Change 20.6.4 [meta.unary]/2 as indicated:
27659 Each of these templates shall be a <i>UnaryTypeTrait</i> (20.6.1),
27660 <del>publicly derived directly or indirectly from <tt>true_type</tt> if the
27661 corresponding condition is true, otherwise from <tt>false_type</tt></del>
27662 <ins>where its <i>BaseCharacteristic</i> shall be <tt>true_type</tt> if the
27663 corresponding condition is true, otherwise <tt>false_type</tt></ins>.
27668 Change 20.6.5 [meta.rel]/2 as indicated:
27672 Each of these templates shall be a <i>BinaryTypeTrait</i> (20.6.1),
27673 <del>publicly derived directly or indirectly from <tt>true_type</tt> if the
27674 corresponding condition is true, otherwise from <tt>false_type</tt></del>
27675 <ins>where its <i>BaseCharacteristic</i> shall be <tt>true_type</tt> if the
27676 corresponding condition is true, otherwise <tt>false_type</tt></ins>.
27687 <h3><a name="1115"></a>1115. <tt>va_copy</tt> missing from Standard macros table</h3>
27688 <p><b>Section:</b> C.2 [diff.library] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
27689 <b>Submitter:</b> Miles Zhao <b>Opened:</b> 2009-05-23 <b>Last modified:</b> 2009-05-23</p>
27690 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#diff.library">active issues</a> in [diff.library].</p>
27691 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#diff.library">issues</a> in [diff.library].</p>
27692 <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>
27693 <p><b>Discussion:</b></p>
27695 In "Table 122 -- Standard macros" of C.2 [diff.library], which lists the 56 macros
27696 inherited from C library, <tt>va_copy</tt> seems to be missing. But in
27697 "Table 21 -- Header <tt><cstdarg></tt> synopsis" (18.10 [support.runtime]), there is.
27701 <p><b>Proposed resolution:</b></p>
27703 Add <tt>va_copy</tt> to Table 122 -- Standard macros in C.2 [diff.library].
27711 <h3><a name="1116"></a>1116. Literal constructors for tuple</h3>
27712 <p><b>Section:</b> 20.5.2 [tuple.tuple] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
27713 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-23 <b>Last modified:</b> 2009-05-24</p>
27714 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple.tuple">issues</a> in [tuple.tuple].</p>
27715 <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>
27716 <p><b>Discussion:</b></p>
27718 It is not currently possible to construct <tt>tuple</tt> literal values,
27719 even if the elements are all literal types. This is because parameters
27720 are passed to constructor by reference.
27723 An alternative would be to pass all constructor arguments by value, where it
27724 is known that *all* elements are literal types. This can be determined with
27725 concepts, although note that the negative constraint really requires
27726 factoring out a separate concept, as there is no way to provide an 'any of
27727 these fails' constraint inline.
27730 Note that we will have similar issues with <tt>pair</tt> (and
27731 <tt>tuple</tt> constructors from <tt>pair</tt>) although I am steering
27732 clear of that class while other constructor-related issues settle.
27736 <p><b>Proposed resolution:</b></p>
27738 Ammend the tuple class template declaration in 20.5.2 [tuple.tuple] as
27744 Add the following concept:
27747 <blockquote><pre>auto concept AllLiteral< typename ... Types > {
27748 requires LiteralType<Types>...;
27750 </pre></blockquote>
27753 ammend the constructor
27756 <blockquote><pre><ins>template <class... UTypes>
27757 requires AllLiteral<Types...>
27758 && Constructible<Types, UTypes>...
27759 explicit tuple(UTypes...);</ins>
27761 template <class... UTypes>
27762 requires <ins>!AllLiteral<Types...></ins>
27763 <ins>&&</ins> Constructible<Types, UTypes&&>...
27764 explicit tuple(UTypes&&...);
27765 </pre></blockquote>
27768 ammend the constructor
27771 <blockquote><pre><ins>template <class... UTypes>
27772 requires AllLiteral<Types...>
27773 && Constructible<Types, UTypes>...
27774 tuple(tuple<UTypes...>);</ins>
27776 template <class... UTypes>
27777 requires <ins>!AllLiteral<Types...></ins>
27778 <ins>&&</ins> Constructible<Types, const UTypes&>...
27779 tuple(const tuple<UTypes...>&);
27780 </pre></blockquote>
27785 Update the same signatures in 20.5.2.1 [tuple.cnstr], paras 3 and 5.
27793 <h3><a name="1117"></a>1117. tuple copy constructor</h3>
27794 <p><b>Section:</b> 20.5.2.1 [tuple.cnstr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
27795 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-23 <b>Last modified:</b> 2009-05-30</p>
27796 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#tuple.cnstr">active issues</a> in [tuple.cnstr].</p>
27797 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple.cnstr">issues</a> in [tuple.cnstr].</p>
27798 <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>
27799 <p><b>Discussion:</b></p>
27801 The copy constructor for the <tt>tuple</tt> template is constrained. This seems an
27802 unusual strategy, as the copy constructor will be implicitly deleted if the
27803 constraints are not met. This is exactly the same effect as requesting an
27804 <tt>=default;</tt> constructor. The advantage of the latter is that it retains
27805 triviality, and provides support for <tt>tuple</tt>s as literal types if issue
27806 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1116">1116</a> is also accepted.
27809 Actually, it might be worth checking with core if a constrained copy
27810 constructor is treated as a constructor template, and as such does not
27811 suppress the implicit generation of the copy constructor which would hide
27812 the template in this case.
27816 2009-05-27 Daniel adds:
27821 This would solve one half of the suggested changes in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#801">801</a>.
27825 <p><b>Proposed resolution:</b></p>
27827 Change 20.5.2 [tuple.tuple] and 20.5.2.1 [tuple.cnstr] p4:
27830 <blockquote><pre><del>requires CopyConstructible<Types>...</del> tuple(const tuple&)<ins> = default</ins>;
27831 </pre></blockquote>
27838 <h3><a name="1118"></a>1118. tuple query APIs do not support cv-qualification</h3>
27839 <p><b>Section:</b> 20.5.2.3 [tuple.helper] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
27840 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-23 <b>Last modified:</b> 2009-05-25</p>
27841 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#tuple.helper">active issues</a> in [tuple.helper].</p>
27842 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple.helper">issues</a> in [tuple.helper].</p>
27843 <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>
27844 <p><b>Discussion:</b></p>
27846 The APIs <tt>tuple_size</tt> and <tt>tuple_element</tt> do not support
27847 cv-qualified <tt>tuple</tt>s, <tt>pair</tt>s or <tt>array</tt>s.
27850 The most generic solution would be to supply partial specializations once
27851 for each cv-type in the <tt>tuple</tt> header. However, requiring this header for
27852 cv-qualified <tt>pair</tt>s/<tt>array</tt>s seems unhelpful. The BSI editorial
27853 suggestion (UK-198/US-69,
27854 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2533.html">N2533</a>)
27855 to merge <tt>tuple</tt> into <tt><utility></tt> would help with <tt>pair</tt>,
27856 but not <tt>array</tt>. That might be resolved by making a dependency between the
27857 <tt><array></tt> header and <tt><utility></tt>, or simply recognising
27858 the dependency be fulfilled in a Remark.
27862 2009-05-24 Daniel adds:
27868 All <tt>tuple_size</tt> templates with a base class need to derive publicly, e.g.
27871 <blockquote><pre>template <IdentityOf T> class tuple_size< const T > :
27872 <ins>public</ins> tuple_size<T> {};
27873 </pre></blockquote>
27876 The same applies to the tuple_element class hierarchies.
27879 What is actually meant with the comment
27882 this solution relies on 'metafunction forwarding' to inherit the
27883 nested typename type
27889 I ask, because all base classes are currently unconstrained and their
27890 instantiation is invalid in the constrained context of the <tt>tuple_element</tt> partial
27891 template specializations.
27896 2009-05-24 Alisdair adds:
27902 I think a better solution might be to ask Pete editorially to change all
27903 declarations of tupling APIs to use the struct specifier instead of class.
27906 "metafunction forwarding" refers to the MPL metafunction protocol, where a
27907 metafunction result is declared as a nested typedef with the name "type",
27908 allowing metafunctions to be chained by means of inheritance. It is a
27909 neater syntax than repeatedly declaring a typedef, and inheritance syntax is
27910 slightly nicer when it comes to additional typename keywords.
27913 The constrained template with an unconstrained base is a good observation
27920 <p><b>Proposed resolution:</b></p>
27922 Add to 20.5.1 [tuple.general] p2 (Header <tt><tuple></tt> synopsis)
27925 <blockquote><pre>// 20.5.2.3, tuple helper classes:
27926 template <IdentityOf T> class tuple_size; // undefined
27927 <ins>template <IdentityOf T> class tuple_size< const T > : tuple_size<T> {};</ins>
27928 <ins>template <IdentityOf T> class tuple_size< volatile T > : tuple_size<T> {};</ins>
27929 <ins>template <IdentityOf T> class tuple_size< const volatile T > : tuple_size<T> {};</ins>
27931 template <VariableType... Types> class tuple_size<tuple<Types...> >;
27933 template <size_t I, IdentityOf T> class tuple_element; // undefined
27934 <ins>template <size_t I, IdentityOf T> class tuple_element<I, const T>;</ins>
27935 <ins>template <size_t I, IdentityOf T> class tuple_element<I, volatile T>;</ins>
27936 <ins>template <size_t I, IdentityOf T> class tuple_element<I, const volatile T>;</ins>
27938 template <size_t I, VariableType... Types>
27939 requires True<(I < sizeof...(Types))> class tuple_element<I, tuple<Types...> >;
27940 </pre></blockquote>
27943 Add to 20.5.2.3 [tuple.helper]
27946 (note that this solution relies on 'metafunction forwarding' to inherit the
27947 nested typename type)
27951 <blockquote><pre>template <class... Types>
27952 class tuple_size<tuple<Types...> >
27953 : public integral_constant<size_t, sizeof...(Types)> { };
27955 template <size_t I, class... Types>
27956 requires True<(I < sizeof...(Types))>
27957 class tuple_element<I, tuple<Types...> > {
27962 <ins>template <size_t I, IdentityOf T>
27963 class tuple_element<I, const T> : add_const<tuple_element<I,T>> {};</ins>
27965 <ins>template <size_t I, IdentityOf T>
27966 class tuple_element<I, volatile T> : add_volatile<tuple_element<I,T>> {};</ins>
27968 <ins>template <size_t I, IdentityOf T>
27969 class tuple_element<I, const volatile T> : add_cv<tuple_element<I,T>> {};</ins>
27970 </pre></blockquote>
27977 <h3><a name="1119"></a>1119. tuple query APIs do not support references</h3>
27978 <p><b>Section:</b> 20.5.2.3 [tuple.helper] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
27979 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-23 <b>Last modified:</b> 2009-05-24</p>
27980 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#tuple.helper">active issues</a> in [tuple.helper].</p>
27981 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#tuple.helper">issues</a> in [tuple.helper].</p>
27982 <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>
27983 <p><b>Discussion:</b></p>
27985 The <tt>tuple</tt> query APIs <tt>tuple_size</tt> and
27986 <tt>tuple_element</tt> do not support references-to-tuples. This can be
27987 annoying when a template deduced a parameter type to be a reference,
27988 which must be explicitly stripped with <tt>remove_reference</tt> before calling
27992 I am not proposing a resolution at this point, as there is a
27993 combinatorial explosion with lvalue/rvalue references and
27994 cv-qualification (see previous issue) that suggests some higher
27995 refactoring is in order. This might be something to kick back over to
27999 Note that we have the same problem in numeric_limits.
28003 <p><b>Proposed resolution:</b></p>
28010 <h3><a name="1120"></a>1120. New type trait - remove_all</h3>
28011 <p><b>Section:</b> 20.6 [meta] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28012 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-23 <b>Last modified:</b> 2009-05-24</p>
28013 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#meta">active issues</a> in [meta].</p>
28014 <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>
28015 <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>
28016 <p><b>Discussion:</b></p>
28018 Sometimes it is necessary to remove all qualifiers from a type before
28019 passing on to a further API. A good example would be calling the
28020 <tt>tuple</tt> query APIs <tt>tuple_size</tt> or <tt>tuple_element</tt>
28021 with a deduced type inside a function template. If the deduced type is
28022 cv-qualified or a reference then the call will fail. The solution is to
28024 <tt>remove_cv<remove_reference<T>::type>::type</tt>, and
28025 note that the order matters.
28028 Suggest it would be helpful to add a new type trait,
28029 <tt>remove_all</tt>, that removes all top-level qualifiers from a type
28030 i.e. cv-qualification and any references. Define the term in such a way
28031 that if additional qualifiers are added to the language, then
28032 <tt>remove_all</tt> is defined as stripping those as well.
28036 <p><b>Proposed resolution:</b></p>
28043 <h3><a name="1121"></a>1121. Support for multiple arguments</h3>
28044 <p><b>Section:</b> 20.4.2 [ratio.arithmetic] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28045 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-25 <b>Last modified:</b> 2009-05-25</p>
28046 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ratio.arithmetic">issues</a> in [ratio.arithmetic].</p>
28047 <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>
28048 <p><b>Discussion:</b></p>
28050 Both add and multiply could sensibly be called with more than two arguments.
28051 The variadic template facility makes such declarations simple, and is likely
28052 to be frequently wrapped by end users if we do not supply the variant
28056 We deliberately ignore divide at this point as it is not transitive.
28057 Likewise, subtract places special meaning on the first argument so I do not
28058 suggest extending that immediately. Both could be supported with analogous
28059 wording to that for add/multiply below.
28062 Note that the proposed resolution is potentially incompatible with that
28063 proposed for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#921">921</a>, although the addition of the typedef to ratio would be
28068 <p><b>Proposed resolution:</b></p>
28070 note that this wording relies on 'metafunction forwarding' as described by
28076 20.4 [ratio] p3 synopsis: change
28079 <blockquote><pre>// ratio arithmetic
28080 template <class R1, class R2<ins>, class ... RList</ins>> struct ratio_add;
28081 template <class R1, class R2> struct ratio_subtract;
28082 template <class R1, class R2<ins>, class ... RList</ins>> struct ratio_multiply;
28083 template <class R1, class R2> struct ratio_divide;
28084 </pre></blockquote>
28087 20.4.2 [ratio.arithmetic] p1: change
28090 <blockquote><pre><ins>template <class R1, class R2, class ... RList> struct ratio_add
28091 : ratio_add< R1, ratio_add<R2, RList...>> {
28094 template <class R1, class R2> struct ratio_add<ins><R1, R2></ins> {
28095 typedef <i>see below</i> type;
28097 </pre></blockquote>
28101 20.4.2 [ratio.arithmetic] p3: change
28104 <blockquote><pre><ins>template <class R1, class R2, class ... RList> struct ratio_multiply
28105 : ratio_multiply< R1, ratio_ multiply <R2, RList...>> {
28108 template <class R1, class R2> struct ratio_ multiply<ins><R1, R2></ins> {
28109 typedef <i>see below</i> type;
28111 </pre></blockquote>
28119 <h3><a name="1122"></a>1122. Ratio values should be constexpr</h3>
28120 <p><b>Section:</b> 20.4.1 [ratio.ratio] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28121 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-25 <b>Last modified:</b> 2009-05-25</p>
28122 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#ratio.ratio">active issues</a> in [ratio.ratio].</p>
28123 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ratio.ratio">issues</a> in [ratio.ratio].</p>
28124 <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>
28125 <p><b>Discussion:</b></p>
28127 The values <tt>num</tt> and <tt>den</tt> in the <tt>ratio</tt> template
28128 should be declared <tt>constexpr</tt>.
28132 <p><b>Proposed resolution:</b></p>
28134 20.4.1 [ratio.ratio]
28137 <blockquote><pre>namespace std {
28138 template <intmax_t N, intmax_t D = 1>
28141 static const<ins>expr</ins> intmax_t num;
28142 static const<ins>expr</ins> intmax_t den;
28145 </pre></blockquote>
28153 <h3><a name="1123"></a>1123. no requirement that standard streams be flushed</h3>
28154 <p><b>Section:</b> 27.5.2.1.6 [ios::Init] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28155 <b>Submitter:</b> James Kanze <b>Opened:</b> 2009-05-14 <b>Last modified:</b> 2009-05-30</p>
28156 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#ios::Init">issues</a> in [ios::Init].</p>
28157 <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>
28158 <p><b>Discussion:</b></p>
28160 As currently formulated, the standard doesn't require that there
28161 is ever a flush of <tt>cout</tt>, etc. (This implies, for example, that
28162 the classical hello, world program may have no output.) In the
28164 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf">N2798</a>),
28165 there is a requirement that the objects
28166 be constructed before <tt>main</tt>, and before the dynamic
28167 initialization of any non-local objects defined after the
28168 inclusion of <tt><iostream></tt> in the same translation unit. The only
28169 requirement that I can find concerning flushing, however, is in
28170 27.5.2.1.6 [ios::Init], where the destructor of the last
28171 <tt>std::ios_base::Init</tt> object flushes. But there is, as far as I
28172 can see, no guarantee that such an object ever exists.
28175 Also, the wording in [iostreams.objects] says that:
28179 are constructed and the associations are established at some
28180 time prior to or during the first time an object of class
28181 <tt>ios_base::Init</tt> is constructed, and in any case before the body
28182 of main begins execution.
28185 In 27.5.2.1.6 [ios::Init], however, as an
28186 effect of the constructor, it says that
28189 If <tt>init_cnt</tt> is zero,
28190 the function stores the value one in <tt>init_cnt</tt>, then constructs
28191 and initializes the objects <tt>cin</tt>, <tt>cout</tt>, <tt>cerr</tt>, <tt>clog</tt>
28192 <tt>wcin</tt>, <tt>wcout</tt>, <tt>wcerr</tt>, and <tt>wclog</tt>"
28196 which seems to forbid earlier
28201 (Note that with these changes, the exposition only "<tt>static
28202 int init_cnt</tt>" in <tt>ios_base::Init</tt> can be dropped.)
28205 Of course, a determined programmer can still inhibit the
28206 flush with things like:
28208 <blockquote><pre>new std::ios_base::Init ; // never deleted
28209 </pre></blockquote>
28211 or (in a function):
28213 <blockquote><pre>std::ios_base::Init ensureConstruction ;
28215 exit( EXIT_SUCCESS ) ;
28216 </pre></blockquote>
28218 Perhaps some words somewhere to the effect that all
28219 <tt>std::ios_base::Init</tt> objects should have static lifetime
28224 <p><b>Proposed resolution:</b></p>
28226 Change 27.4 [iostream.objects]/2:
28230 -2- The objects are constructed and the associations are established at
28231 some time prior to or during the first time an object of class
28232 <tt>ios_base::Init</tt> is constructed, and in any case before the body
28233 of main begins execution.<sup>292</sup> The objects are not destroyed
28234 during program execution.<sup>293</sup>
28235 <del>If a translation unit includes
28236 <tt><iostream></tt> or explicitly constructs an
28237 <tt>ios_base::Init</tt> object, these stream objects shall be
28238 constructed before dynamic initialization of non-local objects defined
28239 later in that translation unit.</del>
28240 <ins>The results of including <tt><iostream></tt> in a translation
28241 unit shall be as if <tt><iostream></tt> defined an instance of
28242 <tt>ios_base::Init</tt> with static lifetime. Similarly, the entire
28243 program shall behave as if there were at least one instance of
28244 <tt>ios_base::Init</tt> with static lifetime.</ins>
28248 Change 27.5.2.1.6 [ios::Init]/3:
28255 -3- <i>Effects:</i> Constructs an object of class <tt>Init</tt>.
28256 <del>If <tt>init_cnt</tt> is zero, the function stores the value one in
28257 <tt>init_cnt</tt>, then constructs and initializes the objects
28258 <tt>cin</tt>, <tt>cout</tt>, <tt>cerr</tt>, <tt>clog</tt> (27.4.1),
28259 <tt>wcin</tt>, <tt>wcout</tt>, <tt>wcerr</tt>, and <tt>wclog</tt>
28260 (27.4.2). In any case, the function then adds one to the value stored in
28261 <tt>init_cnt</tt>.</del>
28262 <ins>Constructs and initializes the objects <tt>cin</tt>, <tt>cout</tt>,
28263 <tt>cerr</tt>, <tt>clog</tt>, <tt>wcin</tt>, <tt>wcout</tt>,
28264 <tt>wcerr</tt> and <tt>wclog</tt> if they have not already been
28265 constructed and initialized.</ins>
28270 Change 27.5.2.1.6 [ios::Init]/4:
28277 -4- <i>Effects:</i> Destroys an object of class <tt>Init</tt>.
28278 <del>The function subtracts one from the value stored in <tt>init_cnt</tt> and,
28279 if the resulting stored value is one,</del>
28280 <ins>If there are no other instances of the class still in
28282 calls <tt>cout.flush()</tt>,
28283 <tt>cerr.flush()</tt>, <tt>clog.flush()</tt>, <tt>wcout.flush()</tt>,
28284 <tt>wcerr.flush()</tt>, <tt>wclog.flush()</tt>.
28294 <h3><a name="1125"></a>1125. ostream_iterator does not work with movable types</h3>
28295 <p><b>Section:</b> 24.6.2.2 [ostream.iterator.ops] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28296 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-28 <b>Last modified:</b> 2009-05-30</p>
28297 <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>
28298 <p><b>Discussion:</b></p>
28300 <tt>ostream_iterator</tt> has not been updated to support moveable types, in a
28301 similar manner to the insert iterators.
28302 Note that this is not a problem for <tt>ostreambuf_iterator</tt>, as the types it is
28303 restricted to dealing with do not support extra-efficient moving.
28307 <p><b>Proposed resolution:</b></p>
28309 Add second <tt>operator=</tt> overload to class <tt>template ostream_iterator</tt>
28310 in 24.6.2 [ostream.iterator], para 2:
28313 <blockquote><pre>ostream_iterator<T,charT,traits>& operator=(const T& value);
28314 <ins>ostream_iterator<T,charT,traits>& operator=(T&& value);</ins>
28315 </pre></blockquote>
28318 Add a new paragraph: in 24.6.2.2 [ostream.iterator.ops]:
28322 <pre>ostream_iterator& operator=(T&& value);
28326 -2- <i>Effects:</i>
28328 <blockquote><pre>*out_stream << std::move(value);
28330 *out_stream << delim;
28332 </pre></blockquote>
28342 <h3><a name="1126"></a>1126. <tt>istreambuff_iterator::equal</tt> needs a const & parameter</h3>
28343 <p><b>Section:</b> 24.6.3.5 [istreambuf.iterator::equal] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28344 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-28 <b>Last modified:</b> 2009-05-30</p>
28345 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#istreambuf.iterator::equal">issues</a> in [istreambuf.iterator::equal].</p>
28346 <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>
28347 <p><b>Discussion:</b></p>
28349 The <tt>equal</tt> member function of <tt>istreambuf_iterator</tt> is
28350 declared <tt>const</tt>, but takes its argument by non-const reference.
28353 This is not compatible with the <tt>operator==</tt> free function overload, which is
28354 defined in terms of calling <tt>equal</tt> yet takes both arguments by reference to
28359 The proposed wording is consistent with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#110">110</a> with status TC1.
28365 <p><b>Proposed resolution:</b></p>
28367 Ammend in both:<br>
28368 24.6.3 [istreambuf.iterator]<br>
28369 24.6.3.5 [istreambuf.iterator::equal]<br>
28372 <blockquote><pre>bool equal(<ins>const </ins>istreambuf_iterator& b) const;
28373 </pre></blockquote>
28381 <h3><a name="1129"></a>1129. <tt>istream(buf)_iterator</tt> should support literal sentinel value</h3>
28382 <p><b>Section:</b> 24.6.1.1 [istream.iterator.cons], 24.6.3 [istreambuf.iterator] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28383 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-30 <b>Last modified:</b> 2009-06-09</p>
28384 <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>
28385 <p><b>Discussion:</b></p>
28387 <tt>istream_iterator</tt> and <tt>istreambuf_iterator</tt> should support literal sentinel
28388 values. The default constructor is frequently used to terminate ranges, and
28389 could easily be a literal value for <tt>istreambuf_iterator</tt>, and
28390 <tt>istream_iterator</tt> when iterating value types. A little more work using a
28391 suitably sized/aligned char-array for storage (or an updated component like
28392 <tt>boost::optional</tt> proposed for TR2) would allow <tt>istream_iterator</tt> to support
28393 <tt>constexpr</tt> default constructor in all cases, although we might leave this
28394 tweak as a QoI issue. Note that requiring <tt>constexpr</tt> be supported also
28395 allows us to place no-throw guarantees on this constructor too.
28399 2009-06-02 Daniel adds:
28405 I agree with the usefulness of the issue suggestion, but we need
28406 to ensure that <tt>istream_iterator</tt> <em>can</em> satisfy be literal if needed.
28407 Currently this is not clear, because 24.6.1 [istream.iterator]/3 declares
28408 a copy constructor and a destructor and explains their semantic in
28409 24.6.1.1 [istream.iterator.cons]/3+4.
28412 The prototype semantic specification is ok (although it seems
28413 somewhat redundant to me, because the semantic doesn't say
28414 anything interesting in both cases), but for support of trivial class
28415 types we also need a trivial copy constructor and destructor as of
28416 9 [class]/6. The current non-informative specification of these
28417 two special members suggests to remove their explicit declaration
28418 in the class and add explicit wording that says that if <tt>T</tt> is
28419 trivial a default constructed iterator is also literal, alternatively it
28420 would be possible to mark both as defaulted and add explicit
28421 (memberwise) wording that guarantees that they are trivial.
28424 Btw.: I'm quite sure that the <tt>istreambuf_iterator</tt> additions to
28425 ensure triviality are not sufficient as suggested, because the
28426 library does not yet give general guarantees that a defaulted
28427 special member declaration makes this member also trivial.
28428 Note that e.g. the atomic types do give a general statement!
28431 Finally there is a wording issue: There does not exist something
28432 like a "literal constructor". The core language uses the term
28433 "constexpr constructor" for this.
28441 Change 24.6.1 [istream.iterator]/3 as indicated:
28443 <blockquote><pre><ins>constexpr</ins> istream_iterator();
28444 istream_iterator(istream_type& s);
28445 istream_iterator(const istream_iterator<del><T,charT,traits,Distance></del>& x)<ins> = default</ins>;
28446 ~istream_iterator()<ins> = default</ins>;
28447 </pre></blockquote>
28451 Change 24.6.1.1 [istream.iterator.cons]/1 as indicated:
28453 <blockquote><pre><ins>constexpr</ins> istream_iterator();
28456 -1- <i>Effects:</i> Constructs the end-of-stream iterator. <ins>If <tt>T</tt> is a literal type,
28457 then this constructor shall be a constexpr constructor.</ins>
28463 Change 24.6.1.1 [istream.iterator.cons]/3 as indicated:
28465 <blockquote><pre>istream_iterator(const istream_iterator<del><T,charT,traits,Distance></del>& x)<ins> = default</ins>;
28468 -3- <i>Effects:</i> Constructs a copy of <tt>x</tt>. <ins>If <tt>T</tt> is a literal type, then
28469 this constructor shall be a trivial copy constructor.</ins>
28475 Change 24.6.1.1 [istream.iterator.cons]/4 as indicated:
28478 <blockquote><pre>~istream_iterator()<ins> = default</ins>;
28481 -4- <i>Effects:</i> The iterator is destroyed. <ins>If <tt>T</tt> is a literal type, then
28482 this destructor shall be a trivial
28489 Change 24.6.3 [istreambuf.iterator] before p. 1 as indicated:
28492 <blockquote><pre><ins>constexpr</ins> istreambuf_iterator() throw();
28493 <ins>istreambuf_iterator(const istreambuf_iterator&) throw() = default;</ins>
28494 <ins>~istreambuf_iterator() throw() = default;</ins>
28495 </pre></blockquote>
28499 Change 24.6.3 [istreambuf.iterator]/1 as indicated:
28502 [..] The default constructor <tt>istreambuf_iterator()</tt> and the constructor
28503 <tt>istreambuf_iterator(0)</tt> both
28504 construct an end of stream iterator object suitable for use as an
28505 end-of-range. <ins>All
28506 specializations of <tt>istreambuf_iterator</tt> shall have a trivial copy
28507 constructor, a constexpr default
28508 constructor and a trivial destructor.</ins>
28515 <p><b>Proposed resolution:</b></p>
28517 24.6.1 [istream.iterator] para 3
28520 <blockquote><pre><ins>constexpr</ins> istream_iterator();
28521 </pre></blockquote>
28524 24.6.1.1 [istream.iterator.cons]
28527 <blockquote><pre><ins>constexpr</ins> istream_iterator();
28530 -1- <i>Effects:</i> Constructs the end-of-stream iterator.
28531 <ins>If <tt>T</tt> is a literal type, then this constructor shall
28532 be a literal constructor.</ins>
28537 24.6.3 [istreambuf.iterator]
28540 <blockquote><pre><ins>constexpr</ins> istreambuf_iterator() throw();
28541 </pre></blockquote>
28549 <h3><a name="1130"></a>1130. <tt>copy_exception</tt> name misleading</h3>
28550 <p><b>Section:</b> 18.8.5 [propagation] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28551 <b>Submitter:</b> Peter Dimov <b>Opened:</b> 2009-05-13 <b>Last modified:</b> 2009-06-02</p>
28552 <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>
28553 <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>
28554 <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>
28555 <p><b>Discussion:</b></p>
28557 The naming of <tt>std::copy_exception</tt> misleads almost everyone
28558 (experts included!) to think that it is the function that copies an
28559 <tt>exception_ptr</tt>:
28562 <blockquote><pre>exception_ptr p1 = current_exception();
28563 exception_ptr p2 = copy_exception( p1 );
28564 </pre></blockquote>
28567 But this is not at all what it does. The above actually creates an
28568 <tt>exception_ptr p2</tt> that contains a copy of <tt>p1</tt>, not of
28569 the exception to which <tt>p1</tt> refers!
28572 This is, of course, all my fault; in my defence, I used <tt>copy_exception</tt>
28573 because I was unable to think of a better name.
28576 But I believe that, based on what we've seen so far, <em>any</em> other name would be better.
28579 Therefore, I propose <tt>copy_exception</tt> to be renamed to
28580 <tt>create_exception</tt>:
28583 <blockquote><pre>template<class E> exception_ptr create_exception(E e);
28584 </pre></blockquote>
28587 with the following explanatory paragraph after it:
28591 Creates an <tt>exception_ptr</tt> that refers to a copy of <tt>e</tt>.
28595 2009-05-13 Daniel adds:
28603 <blockquote><pre>make_exception_ptr
28604 </pre></blockquote>
28606 in similarity to <tt>make_pair</tt> and <tt>make_tuple</tt>, <tt>make_error_code</tt> and
28607 <tt>make_error_condition</tt>, or <tt>make_shared</tt>? Or, if a stronger symmetry to
28608 <tt>current_exception</tt> is preferred:
28611 <blockquote><pre>make_exception
28612 </pre></blockquote>
28614 We have not a single <tt>create_*</tt> function in the library, it was always
28615 <tt>make_*</tt> used.
28620 2009-05-13 Peter adds:
28625 <tt>make_exception_ptr</tt> works for me.
28629 2009-06-02 Thomas J. Gritzan adds:
28635 To avoid surprises and unwanted recursion, how about making a call to
28636 <tt>std::make_exception_ptr</tt> with an <tt>exception_ptr</tt> illegal?
28639 It might work like this:
28641 <blockquote><pre>template<class E>
28642 exception_ptr make_exception_ptr(E e);
28644 exception_ptr make_exception_ptr<exception_ptr>(exception_ptr e) = delete;
28645 </pre></blockquote>
28650 <p><b>Proposed resolution:</b></p>
28652 Change 18.8.5 [propagation]:
28656 <pre>template<class E> exception_ptr <del>copy_exception</del><ins>make_exception_ptr</ins>(E e);
28661 -11- <i>Effects:</i> <ins>Creates an <tt>exception_ptr</tt> that refers
28662 to a copy of <tt>e</tt>,</ins> as if
28665 <blockquote><pre>try {
28668 return current_exception();
28670 </pre></blockquote>
28683 <h3><a name="1131"></a>1131. C++0x does not need <tt>alignment_of</tt></h3>
28684 <p><b>Section:</b> 20.6.4.3 [meta.unary.prop] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28685 <b>Submitter:</b> Niels Dekker <b>Opened:</b> 2009-06-01 <b>Last modified:</b> 2009-06-02</p>
28686 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#meta.unary.prop">active issues</a> in [meta.unary.prop].</p>
28687 <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>
28688 <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>
28689 <p><b>Discussion:</b></p>
28691 The <tt>alignment_of</tt> template is no longer necessary, now that the
28692 core language will provide <tt>alignof</tt>. Scott Meyers raised this
28693 issue at comp.std.c++,
28694 <a href="http://groups.google.com/group/comp.std.c++/browse_thread/thread/9b020306e803f08a">C++0x: alignof vs. alignment_of</a>,
28695 May 21, 2009. In a reply, Daniel Krügler pointed out that
28696 <tt>alignof</tt> was added to the working paper <i>after</i>
28697 <tt>alignment_of</tt>. So it appears that <tt>alignment_of</tt> is only
28698 part of the current Working Draft
28699 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2857.pdf">N2857</a>)
28700 because it is in TR1.
28703 Having both <tt>alignof</tt> and <tt>alignment_of</tt> would cause
28704 unwanted confusion. In general, I think TR1 functionality should not be
28705 brought into C++0x if it is entirely redundant with other C++0x language
28706 or library features.
28710 <p><b>Proposed resolution:</b></p>
28712 Remove from Header <type_traits> synopsis 20.6.2 [meta.type.synop]:
28714 <blockquote><pre><del>template <class T> struct alignment_of;</del>
28715 </pre></blockquote>
28718 Remove the first row of Table 34 ("Type property queries"), from
28719 Type properties 20.6.4.3 [meta.unary.prop]:
28723 <caption>Table 34 -- Type property queries</caption>
28725 <td><del><tt>template <class T> struct alignment_of;</tt></del></td>
28726 <td><del><tt>alignof(T)</tt>.</del><br>
28727 <del><i>Precondition:</i> <tt>T</tt> shall be a complete type, a reference
28728 type, or an array of unknown bound, but shall not be a function type or
28729 (possibly cv-qualified) <tt>void</tt>.</del>
28736 Change text in Table 41 ("Other transformations"), from Other
28737 transformations 20.6.7 [meta.trans.other], as follows:
28741 <caption>Table 41 -- Other transformations</caption>
28742 <tbody><tr><td>...</td>
28744 Align shall be equal to <tt>
28745 <del>alignment_of<T>::value</del>
28746 <ins>alignof(T)</ins>
28747 </tt> for some type <tt>T</tt> or to <i>default-alignment</i>.
28750 </tr></tbody></table>
28758 <h3><a name="1132"></a>1132. JP-30: nested exceptions</h3>
28759 <p><b>Section:</b> 18.8.6 [except.nested] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28760 <b>Submitter:</b> Seiji Hayashida <b>Opened:</b> 2009-06-01 <b>Last modified:</b> 2009-06-02</p>
28761 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#except.nested">active issues</a> in [except.nested].</p>
28762 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#except.nested">issues</a> in [except.nested].</p>
28763 <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>
28764 <p><b>Discussion:</b></p>
28765 <p><b>Addresses JP 30</b></p>
28768 C++0x <tt>nested_exception</tt> cannot handle a structured exception well. The
28769 following codes show two types of tree structured exception handling.
28772 The first one is based on <tt>nested_exception</tt> in C++0x,
28773 while the second one is based on my library <tt>trickerr.h</tt> (in Japanese).
28774 <a href="http://tricklib.com/cxx/dagger/trickerr.h">http://tricklib.com/cxx/dagger/trickerr.h</a>
28777 Assume that Function <tt>A()</tt> calls two sub functions <tt>A_a()</tt> and <tt>A_b()</tt>, both might
28778 throw tree structured exceptions, and <tt>A_b()</tt> must be called even if <tt>A_a()</tt>
28779 throws an exception.
28782 List A (code of tree structured exception handling based on nested_exception
28786 <blockquote><pre>void A()
28790 std::vector<exception_ptr> exception_list;
28793 // A_a() does a similar processing as A().
28798 exception_list.push_back(current_exception());
28801 // ***The processing A() has to do even when A_a() fails. ***
28804 // A_b() does a similar processing as A().
28809 exception_list.push_back(current_exception());
28811 if (!exception_list.empty())
28813 throw exception_list;
28818 throw_with_nested(A_exception("someone error"));
28821 void print_tree_exception(exception_ptr e, const std::string & indent ="")
28823 const char * indent_unit = " ";
28824 const char * mark = "- ";
28827 rethow_exception(e);
28829 catch(const std::vector<exception_ptr> e)
28831 for(std::vector<exception_ptr>::const_iterator i = e.begin(); i!=e.end(); ++i)
28833 print_tree_exception(i, indent);
28836 catch(const std::nested_exception e)
28838 print_tree_exception(evil_i(e), indent +indent_unit);
28840 catch(const std::exception e)
28842 std::cout << indent << mark << e.what() << std::endl;
28846 std::cout << indent << mark << "unknown exception" << std::endl;
28849 int main(int, char * [])
28857 print_tree_exception(current_exception());
28859 return EXIT_SUCCESS;
28861 </pre></blockquote>
28864 List B ( code of tree structured exception handling based on <tt>trickerr.h</tt>. )
28865 "trickerr.h" (in Japanese), refer to:
28866 <a href="http://tricklib.com/cxx/dagger/trickerr.h">http://tricklib.com/cxx/dagger/trickerr.h</a>.
28869 <blockquote><pre>void A()
28871 tricklib::error_listener_type error_listener;
28872 // A_a() is like A(). A_a() can throw tree structured exception.
28875 // *** It must do process so that A_a() throws exception in A(). ***
28876 // A_b() is like A(). A_b() can throw tree structured exception.
28879 if (error_listener.has_error()) // You can write this "if block" in destructor
28880 // of class derived from error_listener_type.
28882 throw_error(new A_error("someone error",error_listener.listener_off().extract_pending_error()));
28885 void print_tree_error(const tricklib::error_type &a_error, const std::string & indent = "")
28887 const char * indent_unit = " ";
28888 const char * mark = "- ";
28890 tricklib::error_type error = a_error;
28893 std::cout << indent << mark << error->message << std::endl;
28894 if (error->children)
28896 print_tree_error(error->children, indent +indent_unit);
28898 error = error->next;
28901 int main(int, char * [])
28903 tricklib::error_thread_power error_thread_power_on; // This object is necessary per thread.
28909 catch(error_type error)
28911 print_tree_error(error);
28915 std::cout << "- unknown exception" << std::endl;
28917 return EXIT_SUCCESS;
28919 </pre></blockquote>
28925 We will focus on the method A() since the other methods, also main(), occur
28926 only once respectively.
28931 In the List A above (of the nested exception handling), it is hard to
28932 find out an active reason to use the nested exception handling at this
28933 scene. Rather, we can take a simpler description by throwing the entire
28934 exception_list directly to the top level.
28937 The code in the same example gives us a kind of redundant impression,
28938 which might have come from the fact that the try-throw-catch framework does
28939 not assume a tree structured exception handling.
28944 According to the above observation, we cannot help concluding that it is not
28945 so easy to use the nested_exception handling as a tree structured exception
28946 handling mechanism in a practical sense.
28949 This text is based on the web page below (in Japanese).
28950 <a href="http://d.hatena.ne.jp/wraith13/20081231/1230715424">http://d.hatena.ne.jp/wraith13/20081231/1230715424</a>
28954 <p><b>Proposed resolution:</b></p>
28963 <h3><a name="1133"></a>1133. Does N2844 break current specification of list::splice?</h3>
28964 <p><b>Section:</b> 23.3.3.5 [forwardlist.ops], 23.3.4.4 [list.ops] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
28965 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-05-09 <b>Last modified:</b> 2009-06-09</p>
28966 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#forwardlist.ops">active issues</a> in [forwardlist.ops].</p>
28967 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#forwardlist.ops">issues</a> in [forwardlist.ops].</p>
28968 <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>
28969 <p><b>Discussion:</b></p>
28972 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html">N2844</a>
28973 means that lvalues will no longer bind to rvalue references.
28974 Therefore, the current specification of <tt>list::splice</tt> (list
28975 operations 23.3.4.4 [list.ops]) will be a breaking change of behaviour for existing
28976 programs. That is because we changed the signature to swallow via an rvalue
28977 reference rather than the lvalue reference used in 03.
28980 Retaining this form would be safer, requiring an explicit move when splicing
28981 from lvalues. However, this will break existing programs.
28982 We have the same problem with <tt>forward_list</tt>, although without the risk of
28983 breaking programs so here it might be viewed as a positive feature.
28986 The problem signatures:
28988 <blockquote><pre>void splice_after(const_iterator position, forward_list<T,Alloc>&& x);
28989 void splice_after(const_iterator position, forward_list<T,Alloc>&& x,
28991 void splice_after(const_iterator position, forward_list<T,Alloc>&& x,
28992 const_iterator first, const_iterator last);
28994 void splice(const_iterator position, list<T,Alloc>&& x);
28995 void splice(const_iterator position, list<T,Alloc>&& x,
28997 void splice(const_iterator position, list<T,Alloc>&& x,
28998 const_iterator first, const_iterator last);
28999 </pre></blockquote>
29001 <b>Possible resolutions:</b>
29004 Option A. Add an additional (non-const) lvalue-reference
29005 overload in each case
29008 Option B. Change rvalue reference back to (non-const)
29009 lvalue-reference overload in each case
29012 Option C. Add an additional (non-const) lvalue-reference
29013 overload in just the <tt>std::list</tt> cases
29016 I think (B) would be very unfortunate, I really like the <tt>forward_list</tt>
29017 behaviour in (C) but feel (A) is needed for consistency.
29020 My actual preference would be NAD, ship with this as a breaking change as it
29021 is a more explicit interface. I don't think that will fly though!
29025 See the thread starting with c++std-lib-23725 for more discussion.
29029 <p><b>Proposed resolution:</b></p>
29036 <h3><a name="1134"></a>1134. Redundant specification of stdint.h, fenv.h, tgmath.h, and maybe complex.h</h3>
29037 <p><b>Section:</b> 18.4.2 [stdinth], 26.3.2 [fenv], 26.8 [c.math], 26.4.11 [cmplxh] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29038 <b>Submitter:</b> Robert Klarer <b>Opened:</b> 2009-05-26 <b>Last modified:</b> 2009-06-14</p>
29039 <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>
29040 <p><b>Discussion:</b></p>
29042 This is probably editorial.
29045 The following items should be removed from the draft, because they're
29046 redundant with Annex D, and they arguably make some *.h headers
29050 18.4.2 [stdinth] (regarding <tt><stdint.h></tt>)
29053 26.3.2 [fenv] (regarding <tt><fenv.h></tt>
29056 Line 3 of 26.8 [c.math] (regarding <tt><tgmath.h></tt>)
29059 26.4.11 [cmplxh] (regarding <tt><complex.h></tt>, though the note in this subclause is not redundant)
29063 2009-06-10 Ganesh adds:
29068 While searching for <tt>stdint</tt> in the CD, I found that <tt><stdint.h></tt> is also
29069 mentioned in 3.9.1 [basic.fundamental] /5. It guess it should refer to
29070 <tt><cstdint></tt> instead.
29074 <p><b>Proposed resolution:</b></p>
29076 Remove the section 18.4.2 [stdinth].
29079 Remove the section 26.3.2 [fenv].
29082 Remove 26.8 [c.math], p3:
29086 <del>-3- The header <tt><tgmath.h></tt> effectively includes the headers <tt><complex.h></tt>
29087 and <tt><math.h></tt>.</del>
29090 Remove the section 26.4.11 [cmplxh].
29098 <h3><a name="1135"></a>1135. <tt>exception_ptr</tt> should support contextual conversion to <tt>bool</tt></h3>
29099 <p><b>Section:</b> 18.8.5 [propagation] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29100 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2007-06-06 <b>Last modified:</b> 2009-06-09</p>
29101 <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>
29102 <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>
29103 <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>
29104 <p><b>Discussion:</b></p>
29107 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2857.pdf">N2857</a>
29108 18.8.5 [propagation]/5, the implementation-defined type
29109 <tt>exception_ptr</tt> does provide the following ways to check whether
29110 it is a null value:
29112 <blockquote><pre>void f(std::exception_ptr p) {
29115 p == exception_ptr();
29117 </pre></blockquote>
29119 This is rather cumbersome way of checking for the null value
29120 and I suggest to require support for evaluation in a boolean
29124 <blockquote><pre>void g(std::exception_ptr p) {
29128 </pre></blockquote>
29131 <p><b>Proposed resolution:</b></p>
29133 In section 18.8.5 [propagation] insert a new paragraph between p.5 and p.6:
29138 An object <tt>e</tt> of type <tt>exception_ptr</tt> can be contextually converted to <tt>bool</tt>.
29139 The effect shall be as if <tt>e != exception_ptr()</tt> had been evaluated in place
29140 of <tt>e</tt>. There shall be no implicit conversion to arithmetic type, to
29141 enumeration type or to pointer type.
29150 <h3><a name="1136"></a>1136. Incomplete specification of <tt>nested_exception::rethrow_nested()</tt></h3>
29151 <p><b>Section:</b> 18.8.6 [except.nested] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29152 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2007-06-06 <b>Last modified:</b> 2009-06-09</p>
29153 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#except.nested">active issues</a> in [except.nested].</p>
29154 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#except.nested">issues</a> in [except.nested].</p>
29155 <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>
29156 <p><b>Discussion:</b></p>
29158 It was recently mentioned in a newsgroup article
29159 <a href="http://groups.google.de/group/comp.std.c++/msg/f82022aff68edf3d">http://groups.google.de/group/comp.std.c++/msg/f82022aff68edf3d</a>
29160 that the specification of the member function <tt>rethrow_nested()</tt> of the
29161 class <tt>nested_exception</tt> is incomplete, specifically it remains unclear
29162 what happens, if member <tt>nested_ptr()</tt> returns a null value. In
29163 18.8.6 [except.nested] we find only the following paragraph related to that:
29165 <blockquote><pre>void rethrow_nested() const; // [[noreturn]]
29168 -4- <i>Throws:</i> the stored exception captured by this <tt>nested_exception</tt> object.
29172 This is a problem, because it is possible to create an object of
29173 <tt>nested_exception</tt> with exactly such a state, e.g.
29175 <blockquote><pre>#include <exception>
29176 #include <iostream>
29179 std::nested_exception e; // OK, calls current_exception() and stores it's null value
29180 e.rethrow_nested(); // ?
29181 std::cout << "A" << std::endl;
29184 std::cout << "B" << std::endl;
29186 </pre></blockquote>
29188 I suggest to follow the proposal of the reporter, namely to invoke
29189 <tt>terminate()</tt> if <tt>nested_ptr()</tt> return a null value of <tt>exception_ptr</tt> instead
29190 of relying on the fallback position of undefined behavior. This would
29191 be consistent to the behavior of a <tt>throw;</tt> statement when no
29192 exception is being handled.
29196 <p><b>Proposed resolution:</b></p>
29198 Change around 18.8.6 [except.nested]/4 as indicated:
29202 -4- <i>Throws:</i> the stored exception captured by this <tt>nested_exception</tt>
29203 object<ins>, if <tt>nested_ptr() != nullptr</tt></ins>
29206 <ins>- <i>Remarks:</i> If <tt>nested_ptr() == nullptr</tt>, <tt>terminate()</tt>
29207 shall be called.</ins>
29216 <h3><a name="1137"></a>1137. Return type of <tt>conj</tt> and <tt>proj</tt></h3>
29217 <p><b>Section:</b> 26.4.9 [cmplx.over] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29218 <b>Submitter:</b> Marc Steinbach <b>Opened:</b> 2009-06-11 <b>Last modified:</b> 2009-06-27</p>
29219 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#cmplx.over">issues</a> in [cmplx.over].</p>
29220 <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>
29221 <p><b>Discussion:</b></p>
29223 In clause 1, the Working Draft
29224 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2857.pdf">N2857</a>)
29225 specifies overloads of the
29228 <blockquote><pre>arg, conj, imag, norm, proj, real
29229 </pre></blockquote>
29231 for non-complex arithmetic types (<tt>float</tt>, <tt>double</tt>,
29232 <tt>long double</tt>, and integers).
29233 The only requirement (clause 2) specifies effective type promotion of arguments.
29236 I strongly suggest to add the following requirement on the return types:
29239 All the specified overloads must return real (i.e., non-complex) values,
29240 specifically, the nested <tt>value_type</tt> of effectively promoted arguments.
29244 (This has no effect on <tt>arg</tt>, <tt>imag</tt>, <tt>norm</tt>, <tt>real</tt>:
29245 they are real-valued anyway.)
29247 <p><b>Rationale:</b></p>
29249 Mathematically, <tt>conj()</tt> and <tt>proj()</tt>, like the transcendental functions, are
29250 complex-valued in general but map the (extended) real line to itself.
29251 In fact, both functions act as identity on the reals.
29252 A typical user will expect <tt>conj()</tt> and <tt>proj()</tt> to preserve this essential
29253 mathematical property in the same way as <tt>exp()</tt>, <tt>sin()</tt>, etc.
29254 A typical use of <tt>conj()</tt>, e.g., is the generic scalar product of n-vectors:
29257 <blockquote><pre>template<typename T>
29259 scalar_product(size_t n, T const* x, T const* y) {
29261 for (size_t i = 0; i < n; ++i)
29262 result += x[i] * std::conj(y[i]);
29265 </pre></blockquote>
29267 This will work equally well for real and complex floating-point types <tt>T</tt> if
29268 <tt>conj()</tt> returns <tt>T</tt>. It will not work with real types if <tt>conj()</tt>
29269 returns complex values.
29272 Instead, the implementation of <tt>scalar_product</tt> becomes either less efficient
29273 and less useful (if a complex result is always returned), or unnecessarily
29274 complicated (if overloaded versions with proper return types are defined).
29275 In the second case, the real-argument overload of <tt>conj()</tt> cannot be used.
29276 In fact, it must be avoided.
29279 Overloaded <tt>conj()</tt> and <tt>proj()</tt> are principally needed in generic programming.
29280 All such use cases will benefit from the proposed return type requirement,
29281 in a similar way as the <tt>scalar_product</tt> example.
29282 The requirement will not harm use cases where a complex return value
29283 is expected, because of implicit conversion to complex.
29284 Without the proposed return type guarantee, I find overloaded versions
29285 of <tt>conj()</tt> and <tt>proj()</tt> not only useless but actually troublesome.
29290 <p><b>Proposed resolution:</b></p>
29292 Insert a new paragraph after 26.4.9 [cmplx.over]/2:
29297 All of the specified overloads shall have a return type which is the nested <tt>value_type</tt> of
29298 the effectively promoted arguments.
29307 <h3><a name="1138"></a>1138. unusal return value for operator+</h3>
29308 <p><b>Section:</b> 21.4.8.1 [string::op+] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29309 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-06-12 <b>Last modified:</b> 2009-06-15</p>
29310 <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>
29311 <p><b>Discussion:</b></p>
29313 Many of the <tt>basic_string operator+</tt> overloads return an rvalue-reference. Is
29314 that really intended?
29317 I'm considering it might be a mild performance tweak to avoid making
29318 un-necessary copies of a cheaply movable type, but it opens risk to dangling
29319 references in code like:
29322 <blockquote><pre>auto && s = string{"x"} + string{y};
29323 </pre></blockquote>
29326 and I'm not sure about:
29329 <blockquote><pre>auto s = string{"x"} + string{y};
29330 </pre></blockquote>
29333 <p><b>Proposed resolution:</b></p>
29335 Strike the <tt>&&</tt> from the return type in the following function
29341 21.3 [string.classes] p2 Header Synopsis
29344 <blockquote><pre>template<class charT, class traits, class Allocator>
29345 basic_string<charT,traits,Allocator><del>&&</del>
29346 operator+(basic_string<charT,traits,Allocator>&& lhs,
29347 const basic_string<charT,traits,Allocator>& rhs);
29349 template<class charT, class traits, class Allocator>
29350 basic_string<charT,traits,Allocator><del>&&</del>
29351 operator+(const basic_string<charT,traits,Allocator>& lhs,
29352 basic_string<charT,traits,Allocator>&& rhs);
29354 template<class charT, class traits, class Allocator>
29355 basic_string<charT,traits,Allocator><del>&&</del>
29356 operator+(basic_string<charT,traits,Allocator>&& lhs,
29357 basic_string<charT,traits,Allocator>&& rhs);
29360 template<class charT, class traits, class Allocator>
29361 basic_string<charT,traits,Allocator><del>&&</del>
29362 operator+(const charT* lhs,
29363 basic_string<charT,traits,Allocator>&& rhs);
29365 template<class charT, class traits, class Allocator>
29366 basic_string<charT,traits,Allocator><del>&&</del>
29367 operator+(charT lhs, basic_string<charT,traits,Allocator>&& rhs);
29369 template<class charT, class traits, class Allocator>
29370 basic_string<charT,traits,Allocator><del>&&</del>
29371 operator+(basic_string<charT,traits,Allocator>&& lhs,
29374 template<class charT, class traits, class Allocator>
29375 basic_string<charT,traits,Allocator><del>&&</del>
29376 operator+(basic_string<charT,traits,Allocator>&& lhs, charT rhs);
29377 </pre></blockquote>
29380 21.4.8.1 [string::op+]
29383 <blockquote><pre>template<class charT, class traits, class Allocator>
29384 basic_string<charT,traits,Allocator><del>&&</del>
29385 operator+(basic_string<charT,traits,Allocator>&& lhs,
29386 const basic_string<charT,traits,Allocator>& rhs);
29388 template<class charT, class traits, class Allocator>
29389 basic_string<charT,traits,Allocator><del>&&</del>
29390 operator+(const basic_string<charT,traits,Allocator>& lhs,
29391 basic_string<charT,traits,Allocator>&& rhs);
29393 template<class charT, class traits, class Allocator>
29394 basic_string<charT,traits,Allocator><del>&&</del>
29395 operator+(basic_string<charT,traits,Allocator>&& lhs,
29396 basic_string<charT,traits,Allocator>&& rhs);
29399 template<class charT, class traits, class Allocator>
29400 basic_string<charT,traits,Allocator><del>&&</del>
29401 operator+(const charT* lhs,
29402 basic_string<charT,traits,Allocator>&& rhs);
29404 template<class charT, class traits, class Allocator>
29405 basic_string<charT,traits,Allocator><del>&&</del>
29406 operator+(charT lhs, basic_string<charT,traits,Allocator>&& rhs);
29408 template<class charT, class traits, class Allocator>
29409 basic_string<charT,traits,Allocator><del>&&</del>
29410 operator+(basic_string<charT,traits,Allocator>&& lhs,
29413 template<class charT, class traits, class Allocator>
29414 basic_string<charT,traits,Allocator><del>&&</del>
29415 operator+(basic_string<charT,traits,Allocator>&& lhs, charT rhs);
29416 </pre></blockquote>
29426 <h3><a name="1144"></a>1144. "thread safe" is undefined</h3>
29427 <p><b>Section:</b> 18.5 [support.start.term] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29428 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-16 <b>Last modified:</b> 2009-07-04</p>
29429 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#support.start.term">issues</a> in [support.start.term].</p>
29430 <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>
29431 <p><b>Discussion:</b></p>
29433 <p><b>Addresses UK 187</b></p>
29436 The term "thread safe" is not defined nor used in this context
29437 anywhere else in the standard.
29440 <p><b>Suggested action:</b></p>
29442 Clarify the meaning of "thread safe".
29446 <p><b>Proposed resolution:</b></p>
29453 <h3><a name="1145"></a>1145. inappropriate headers for atomics</h3>
29454 <p><b>Section:</b> 29 [atomics] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29455 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-16 <b>Last modified:</b> 2009-07-04</p>
29456 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics">active issues</a> in [atomics].</p>
29457 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#atomics">issues</a> in [atomics].</p>
29458 <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>
29459 <p><b>Discussion:</b></p>
29461 <p><b>Addresses UK 312</b></p>
29464 The contents of the <tt><stdatomic.h></tt> header are not listed anywhere,
29465 and <tt><cstdatomic></tt> is listed as a C99 header in chapter 17.
29466 If we intend to use these for compatibility with a future C standard,
29467 we should not use them now.
29471 <p><b>Proposed resolution:</b></p>
29473 Remove <tt><cstdatomic></tt> from the C99 headers in table 14.
29474 Add a new header <tt><atomic></tt> to the headers in table 13.
29475 Update chapter 29 to remove reference to <tt><stdatomic.h></tt>
29476 and replace the use of <tt><cstdatomic></tt> with <tt><atomic></tt>.
29479 If and when WG14 adds atomic operations to C
29480 we can add corresponding headers to table 14 with a TR.
29489 <h3><a name="1146"></a>1146. "lockfree" does not say enough</h3>
29490 <p><b>Section:</b> 29.4 [atomics.lockfree] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29491 <b>Submitter:</b> Jeffrey Yasskin <b>Opened:</b> 2009-06-16 <b>Last modified:</b> 2009-07-04</p>
29492 <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>
29493 <p><b>Discussion:</b></p>
29495 <p><b>Addresses US 88</b></p>
29498 The "lockfree" facilities do not tell the programmer enough.
29502 There are 2 problems here.
29503 First, at least on x86,
29504 it's less important to me whether some integral types are lock free
29505 than what is the largest type I can pass to atomic and have it be lock-free.
29506 For example, if <tt>long long</tt>s are not lock-free,
29507 <tt>ATOMIC_INTEGRAL_LOCK_FREE</tt> is probably 1,
29508 but I'd still be interested in knowing whether longs are always lock-free.
29509 Or if long longs at any address are lock-free,
29510 I'd expect <tt>ATOMIC_INTEGRAL_LOCK_FREE</tt> to be 2,
29511 but I may actually care whether I have access to
29512 the <code>cmpxchg16b</code> instruction.
29513 None of the support here helps with that question.
29514 (There are really 2 related questions here:
29515 what alignment requirements are there for lock-free access;
29516 and what processor is the program actually running on,
29517 as opposed to what it was compiled for?)
29521 Second, having <tt>atomic_is_lock_free</tt> only apply to individual objects
29523 (except, as Lawrence Crowl points out,
29524 for throwing an exception when an object is unexpectedly not lock-free).
29525 I'm likely to want to use its result to decide what algorithm to use,
29526 and that algorithm is probably going to allocate new memory
29527 containing atomic objects and then try to act on them.
29528 If I can't predict the lock-freedom of the new object
29529 by checking the lock-freedom of an existing object,
29530 I may discover after starting the algorithm that I can't continue.
29534 2009-06-16 Jeffrey Yasskin adds:
29540 To solve the first problem, I think 2 macros would help:
29541 <tt>MAX_POSSIBLE_LOCK_FREE_SIZE</tt> and <tt>MAX_GUARANTEED_LOCK_FREE_SIZE</tt>,
29542 which expand to the maximum value of <tt>sizeof(T)</tt> for which atomic may
29543 (or will, respectively) use lock-free operations.
29544 Lawrence points out that this
29545 "relies heavily on implementations
29546 using word-size compare-swap on sub-word-size types,
29547 which in turn requires address modulation."
29548 He expects that to be the end state anyway, so it doesn't bother him much.
29552 To solve the second,
29553 I think one could specify that equally aligned objects of the same type
29554 will return the same value from <tt>atomic_is_lock_free()</tt>.
29555 I don't know how to specify "equal alignment".
29556 Lawrence suggests an additional function, <tt>atomic_is_always_lock_free()</tt>.
29562 <p><b>Proposed resolution:</b></p>
29569 <h3><a name="1147"></a>1147. non-volatile atomic functions</h3>
29570 <p><b>Section:</b> 29.6 [atomics.types.operations] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29571 <b>Submitter:</b> Jeffrey Yasskin <b>Opened:</b> 2009-06-16 <b>Last modified:</b> 2009-07-04</p>
29572 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#atomics.types.operations">active issues</a> in [atomics.types.operations].</p>
29573 <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>
29574 <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>
29575 <p><b>Discussion:</b></p>
29577 <p><b>Addresses US 90</b></p>
29581 declares all of the functions dealing with atomics (section 29.6 [atomics.types.operations])
29582 to take volatile arguments.
29583 Yet it also says (29.4-3),
29588 [ Note: Many operations are volatile-qualified.
29589 The "volatile as device register" semantics have not changed in the standard.
29590 This qualification means that volatility is preserved
29591 when applying these operations to volatile objects.
29592 It does not mean that operations on non-volatile objects become volatile.
29593 Thus, volatile qualified operations on non-volatile objects
29594 may be merged under some conditions. —end note ]
29599 I was thinking about how to implement this in gcc,
29600 and I believe that we'll want to overload most of the functions
29601 on volatile and non-volatile.
29606 To let the compiler take advantage of the permission
29607 to merge non-volatile atomic operations and reorder atomics in certain,
29608 we'll need to tell the compiler backend
29609 about exactly which atomic operation was used.
29610 So I expect most of the functions of the form atomic_<op>_explicit()
29611 (e.g. atomic_load_explicit, atomic_exchange_explicit,
29612 atomic_fetch_add_explicit, etc.)
29613 to become compiler builtins.
29614 A builtin can tell whether its argument was volatile or not,
29615 so those functions don't really need extra explicit overloads.
29616 However, I don't expect that we'll want to add builtins
29617 for every function in chapter 29,
29618 since most can be implemented in terms of the _explicit free functions:
29621 <pre><code>class atomic_int {
29622 __atomic_int_storage value;
29624 int fetch_add(int increment, memory_order order = memory_order_seq_cst) volatile {
29625 // &value has type "volatile __atomic_int_storage*".
29626 atomic_fetch_add_explicit(&value, increment, order);
29633 But now this <em>always</em> calls
29634 the volatile builtin version of atomic_fetch_add_explicit(),
29635 even if the atomic_int wasn't declared volatile.
29636 To preserve volatility and the compiler's permission to optimize,
29640 <pre><code>class atomic_int {
29641 __atomic_int_storage value;
29643 int fetch_add(int increment, memory_order order = memory_order_seq_cst) volatile {
29644 atomic_fetch_add_explicit(&value, increment, order);
29646 int fetch_add(int increment, memory_order order = memory_order_seq_cst) {
29647 atomic_fetch_add_explicit(&value, increment, order);
29654 But this is visibly different from the declarations in the standard
29655 because it's now overloaded.
29656 (Consider passing &atomic_int::fetch_add as a template parameter.)
29660 The implementation may already have permission to add overloads
29661 to the member functions:
29666 17.6.4.5 [member.functions] An implementation may declare additional non-virtual
29667 member function signatures within a class:<br>
29671 <li>by adding a member function signature for a member function name.</li>
29676 but I don't see an equivalent permission to add overloads to the free functions.
29680 2009-06-16 Lawrence adds:
29686 I recommend allowing non-volatile overloads.
29692 <p><b>Proposed resolution:</b></p>
29699 <h3><a name="1148"></a>1148. Wrong argument type of I/O stream manipulators <tt>setprecision()</tt>
29700 and <tt>setw()</tt></h3>
29701 <p><b>Section:</b> 27.7 [iostream.format] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29702 <b>Submitter:</b> Marc Steinbach <b>Opened:</b> 2009-06-20 <b>Last modified:</b> 2009-07-30</p>
29703 <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>
29704 <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>
29705 <p><b>Discussion:</b></p>
29707 The header <tt><iomanip></tt> synopsis in 27.7 [iostream.format] specifies
29709 <blockquote><pre>T5 setprecision(int n);
29711 </pre></blockquote>
29714 The argument types should be streamsize, as in class <tt>ios_base</tt>
29715 (see 27.5.2 [ios.base]):
29717 <blockquote><pre>streamsize precision() const;
29718 streamsize precision(streamsize prec);
29719 streamsize width() const;
29720 streamsize width(streamsize wide);
29721 </pre></blockquote>
29724 (Editorial: 'wide' should probably be renamed as 'width', or maybe just 'w'.)
29728 2009-07-29 Daniel clarified wording.
29733 <p><b>Proposed resolution:</b></p>
29737 In 27.7 [iostream.format], header <tt><iomanip></tt> synopsis change as indicated:
29740 <blockquote><pre>T5 setprecision(<del>int</del><ins>streamsize</ins> n);
29741 T6 setw(<del>int</del><ins>streamsize</ins> n);
29742 </pre></blockquote>
29747 In 27.7.3 [std.manip], just before p. 6 change as indicated:
29750 <blockquote><pre>unspecified setprecision(<del>int</del><ins>streamsize</ins> n);
29751 </pre></blockquote>
29756 In 27.7.3 [std.manip], just before p. 7 change as indicated:
29759 <blockquote><pre>unspecified setw(<del>int</del><ins>streamsize</ins> n);
29760 </pre></blockquote>
29772 <h3><a name="1150"></a>1150. wchar_t, char16_t and char32_t filenames</h3>
29773 <p><b>Section:</b> 27.9.1.14 [fstream] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29774 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-04</p>
29775 <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>
29776 <p><b>Discussion:</b></p>
29777 <p><b>Addresses JP 73</b></p>
29779 <p><b>Description</b></p>
29781 from C++98, <tt>fstream</tt> cannot appoint a filename of wide
29782 character string(<tt>const wchar_t</tt> and <tt>const wstring&</tt>).</p>
29783 <p><b>Suggestion</b></p>
29785 interface corresponding to <tt>wchar_t</tt>, <tt>char16_t</tt> and <tt>char32_t</tt>.</p>
29788 2009-07-01 Alisdair notes that this is a duplicate of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454">454</a> which has more
29789 in-depth rationale.
29794 <p><b>Proposed resolution:</b></p>
29801 <h3><a name="1151"></a>1151. Behavior of the library in the presence of threads is incompletely specified</h3>
29802 <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>
29803 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-06-28</p>
29804 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#library">active issues</a> in [library].</p>
29805 <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>
29806 <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>
29807 <p><b>Discussion:</b></p>
29808 <p><b>Addresses US 63</b></p>
29810 <p><b>Description</b></p>
29811 <p>The behavior of the library in the presence of threads
29812 is incompletely specified.</p>
29813 <p>For example, if thread 1 assigns to <tt>X</tt>, then writes data
29814 to file <tt>f</tt>, which is read by thread 2, and then accesses
29815 variable <tt>X</tt>, is thread 2 guaranteed to be able to see the
29816 value assigned to <tt>X</tt> by thread 1? In other words, does the
29817 write of the data "happen before" the read?</p>
29818 <p>Another example: does simultaneous access using <tt>operator
29819 at()</tt> to different characters in the same non-const string
29820 really introduce a data race?</p>
29821 <p><b>Suggestion</b></p>
29822 <p><b>Notes</b></p><p>17 SG: should go to threads group; misclassified in document
29825 <p>Concurrency SG: Create an issue. Hans will look into it.</p>
29828 <p><b>Proposed resolution:</b></p>
29835 <h3><a name="1152"></a>1152. expressions parsed differently than intended</h3>
29836 <p><b>Section:</b> 22.4.2.2.2 [facet.num.put.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29837 <b>Submitter:</b> Seungbeom Kim <b>Opened:</b> 2009-06-27 <b>Last modified:</b> 2009-07-24</p>
29838 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#facet.num.put.virtuals">active issues</a> in [facet.num.put.virtuals].</p>
29839 <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>
29840 <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>
29841 <p><b>Discussion:</b></p>
29843 In Table 73 -- Floating-point conversions, 22.4.2.2.2 [facet.num.put.virtuals],
29845 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf">N2914</a>,
29846 we have the following entries:
29849 <caption>Table 73 — Floating-point conversions</caption>
29851 <th>State</th> <th><tt>stdio</tt> equivalent</th>
29854 <td><tt>floatfield == ios_base::fixed | ios_base::scientific && !uppercase</tt></td>
29855 <td align="center"><tt>%a</tt></td>
29859 <td><tt>floatfield == ios_base::fixed | ios_base::scientific</tt></td>
29860 <td align="center"><tt>%A</tt></td>
29865 These expressions are supposed to mean:
29868 <blockquote><pre>floatfield == (ios_base::fixed | ios_base::scientific) && !uppercase
29869 floatfield == (ios_base::fixed | ios_base::scientific)
29870 </pre></blockquote>
29872 but technically parsed as:
29874 <blockquote><pre>((floatfield == ios_base::fixed) | ios_base::scientific) && (!uppercase)
29875 ((floatfield == ios_base::fixed) | ios_base::scientific)
29876 </pre></blockquote>
29878 and should be corrected with additional parentheses, as shown above.
29882 <p><b>Proposed resolution:</b></p>
29884 Change Table 73 — Floating-point conversions in 22.4.2.2.2 [facet.num.put.virtuals]:
29888 <caption>Table 73 — Floating-point conversions</caption>
29890 <th>State</th> <th><tt>stdio</tt> equivalent</th>
29893 <td><tt>floatfield == <ins>(</ins>ios_base::fixed | ios_base::scientific<ins>)</ins> && !uppercase</tt></td>
29894 <td align="center"><tt>%a</tt></td>
29898 <td><tt>floatfield == <ins>(</ins>ios_base::fixed | ios_base::scientific<ins>)</ins></tt></td>
29899 <td align="center"><tt>%A</tt></td>
29908 <h3><a name="1153"></a>1153. Standard library needs review for constructors to be
29909 explicit to avoid treatment as initializer-list constructor</h3>
29910 <p><b>Section:</b> 17 [library], 30 [thread], D [depr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29911 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-04</p>
29912 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#library">active issues</a> in [library].</p>
29913 <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>
29914 <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>
29915 <p><b>Discussion:</b></p>
29917 <p><b>Addresses DE 2</b></p>
29919 <p><b>Description</b></p>
29920 <p>Marking a constructor with <tt>explicit</tt> has semantics
29921 even for a constructor with zero or several parameters:
29922 Such a constructor cannot be used with list-initialization
29923 in a copy-initialization context, see 13.3.1.7 [over.match.list]. The
29924 standard library apparently has not been reviewed for
29925 marking non-single-parameter constructors as <tt>explicit</tt>.</p>
29926 <p><b>Suggestion</b></p>
29927 <p>Consider marking zero-parameter and multi-parameter
29928 constructors <tt>explicit</tt> in classes that have at least one
29929 constructor marked <tt>explicit</tt> and that do not have an
29930 initializer-list constructor.</p>
29932 <p><b>Notes</b></p>
29933 <p>Robert Klarer to address this one.</p>
29937 <p><b>Proposed resolution:</b></p>
29944 <h3><a name="1154"></a>1154. <tt>complex</tt> should accept integral types</h3>
29945 <p><b>Section:</b> 26.4 [complex.numbers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29946 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-04</p>
29947 <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>
29948 <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>
29949 <p><b>Discussion:</b></p>
29951 <p><b>Addresses FR 35</b></p>
29953 <p><b>Description</b></p>
29954 <p>Instantiations of the class
29955 template <tt>complex<></tt> have to be allowed for integral
29956 types, to reflect existing practice and ISO standards
29959 <p><b>Suggestion</b></p>
29963 <p><b>Proposed resolution:</b></p>
29970 <h3><a name="1155"></a>1155. Reference should be to C99</h3>
29971 <p><b>Section:</b> C.2 [diff.library] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
29972 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-25</p>
29973 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#diff.library">active issues</a> in [diff.library].</p>
29974 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#diff.library">issues</a> in [diff.library].</p>
29975 <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>
29976 <p><b>Discussion:</b></p>
29978 <p><b>Addresses FR 38</b></p>
29980 <p><b>Description</b></p>
29981 <p>What is ISO/IEC 1990:9899/DAM
29982 1? My guess is that's a typo for ISO/IEC
29983 9899/Amd.1:1995 which I'd
29984 have expected to be referenced here (the tables
29985 make reference to things
29986 which were introduced by Amd.1).</p>
29987 <p><b>Suggestion</b></p>
29988 <p>One need probably a reference
29989 to the document which introduce <tt>char16_t</tt> and
29990 <tt>char32_t</tt> in C (ISO/IEC TR 19769:2004?).</p>
29991 <p><b>Notes</b></p>
29992 <p>Create issue. Document in question should be C99, not C90+amendment1. The
29993 rest of the section requires careful review for completeness. Example <cstdint>
29994 18.4.1 [cstdint.syn]. Assign to C liasons.</p>
29998 <p><b>Proposed resolution:</b></p>
30005 <h3><a name="1156"></a>1156. Constraints on bitmask and enumeration types to be tightened</h3>
30006 <p><b>Section:</b> 17.5.2.1.2 [enumerated.types], 17.5.2.1.3 [bitmask.types] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30007 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-25</p>
30008 <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>
30009 <p><b>Discussion:</b></p>
30011 <p><b>Addresses UK 165</b></p>
30013 <p><b>Description</b></p>
30015 bitmask and enumeration types were supposed to be tightened
30016 up as part of the motivation for the <tt>constexpr</tt> feature -
30018 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf">N2235</a>
30020 <p><b>Suggestion</b></p>
30021 <p>Adopt wording in line with the motivation
30023 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf">N2235</a></p>
30024 <p><b>Notes</b></p>
30025 <p>Robert Klarer to review</p>
30029 <p><b>Proposed resolution:</b></p>
30036 <h3><a name="1157"></a>1157. Local types can now instantiate templates</h3>
30037 <p><b>Section:</b> 17.6.3.2.1 [namespace.std] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>
30038 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-28</p>
30039 <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>
30040 <p><b>Discussion:</b></p>
30042 <p><b>Addresses UK 175</b></p>
30044 <p><b>Description</b></p>
30046 now be used to instantiate templates, but don't have
30047 external linkage.</p>
30048 <p><b>Suggestion</b></p>
30049 <p>Remove the reference to external linkage.</p>
30051 <p><b>Notes</b></p>
30052 <p>We accept the proposed solution. Martin will draft an issue.</p>
30055 2009-07-28 Alisdair provided wording.
30061 <p><b>Proposed resolution:</b></p>
30063 17.6.3.2.1 [namespace.std]
30066 Strike "of external linkage" in p1 and p2:
30071 -1- The behavior of a C++ program is undefined if it adds declarations or
30072 definitions to namespace <tt>std</tt> or to a namespace within namespace <tt>std</tt>
30073 unless otherwise specified. A program may add a concept map for any
30074 standard library concept or a template specialization for any standard
30075 library template to namespace <tt>std</tt> only if the declaration depends on a
30076 user-defined type <del>of external linkage</del> and the specialization meets the
30077 standard library requirements for the original template and is not
30078 explicitly prohibited.<sup>179</sup>
30082 -2- The behavior of a C++ program is undefined if it declares
30086 an explicit specialization of any member function of a standard library
30090 an explicit specialization of any member function template of a standard
30091 library class or class template, or
30094 an explicit or partial specialization of any member class template of a
30095 standard library class or class template.
30099 A program may explicitly instantiate a template defined in the standard
30100 library only if the declaration depends on the name of a user-defined
30101 type <del>of external linkage</del> and the instantiation meets the standard
30102 library requirements for the original template.
30112 <h3><a name="1158"></a>1158. Encouragement to use monotonic clock</h3>
30113 <p><b>Section:</b> 30.2.4 [thread.req.timing] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30114 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-05</p>
30115 <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>
30116 <p><b>Discussion:</b></p>
30118 <p><b>Addresses UK 322, US 96</b></p>
30120 <p><b>Description</b></p>
30122 can provide a monotonic clock. How are they expected to
30123 treat a _for function?</p>
30124 <p><b>Suggestion</b></p>
30125 <p>Add at least a note explaining the intent
30126 for systems that do not support a monotonic clock.</p>
30128 <p><b>Notes</b></p>
30129 <p>Create an issue, together with UK 96. Note that the specification as is
30130 already allows a non-monotonic clock due to the word “should” rather than
30131 “shall”. If this wording is kept, a footnote should be added to make the
30134 <p><i>[ 2009-06-29 Beman provided a proposed resolution. ] </i></p>
30138 <p><b>Proposed resolution:</b></p>
30140 <p><i>Change Timing specifications 30.2.4 [thread.req.timing] as indicated:</i></p>
30142 <p>The member functions whose names end in <tt>_for</tt> take an argument that
30143 specifies a relative time. Implementations
30144 <del>should</del> <ins>are encouraged but not required to</ins> use a
30145 monotonic clock to measure time for these functions.</p>
30153 <h3><a name="1159"></a>1159. Unclear spec for <tt>resource_deadlock_would_occur</tt></h3>
30154 <p><b>Section:</b> 30.4.3.2.2 [thread.lock.unique.locking] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30155 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-04</p>
30156 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.lock.unique.locking">active issues</a> in [thread.lock.unique.locking].</p>
30157 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.lock.unique.locking">issues</a> in [thread.lock.unique.locking].</p>
30158 <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>
30159 <p><b>Discussion:</b></p>
30161 <p><b>Addresses UK 327, UK 328</b></p>
30163 <p><b>UK 327 Description</b></p>
30165 the specification for error condition
30166 <tt>resource_deadlock_would_occur</tt> means. It is perfectly
30167 possible for this thread to own the mutex without setting
30168 owns to true on this specific lock object. It is also
30169 possible for lock operations to succeed even if the thread
30170 does own the mutex, if the mutex is recursive. Likewise, if
30171 the mutex is not recursive and the mutex has been locked
30172 externally, it is not always possible to know that this
30173 error condition should be raised, depending on the host
30174 operating system facilities. It is possible that 'i.e.' was
30175 supposed to be 'e.g.' and that suggests that recursive
30176 locks are not allowed. That makes sense, as the
30177 exposition-only member owns is boolean and not a integer to
30178 count recursive locks.</p>
30180 <p><b>UK 327 Suggestion</b></p>
30181 <p>Add a precondition <tt>!owns</tt>. Change the 'i.e.'
30182 in the error condition to be 'e.g.' to allow for this
30183 condition to propogate deadlock detection by the host OS.</p>
30184 <p><b>UK 327 Notes</b></p>
30185 <p>Create an issue. Assigned to Lawrence Crowl. Note: not sure what try_lock
30186 means for recursive locks when you are the owner. POSIX has language on
30187 this, which should ideally be followed. Proposed fix is not quite right, for
30188 example, try_lock should have different wording from lock.</p>
30190 <p><b>UK 328 Description</b></p>
30192 <p>There is a missing precondition that <tt>owns</tt>
30193 is true, or an <tt>if(owns)</tt> test is missing from the effect
30195 <p><b>UK 328 Suggestion</b></p>
30197 precondition that <tt>owns == true</tt>. Add an error condition to
30198 detect a violation, rather than yield undefined behaviour.</p>
30199 <p><b>UK 328 Notes</b></p>
30200 <p>Handle in same issue as UK 327. Also uncertain that the proposed resolution
30201 is the correct one.</p>
30206 <p><b>Proposed resolution:</b></p>
30213 <h3><a name="1160"></a>1160. <tt>future_error</tt> public constructor is 'exposition only'</h3>
30214 <p><b>Section:</b> 30.6.3 [futures.future_error] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
30215 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-17</p>
30216 <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>
30217 <p><b>Discussion:</b></p>
30219 <p><b>Addresses UK 331</b></p>
30221 <p><b>Description</b></p>
30223 it means for a public constructor to be 'exposition only'.
30224 If the intent is purely to support the library calling this
30225 constructor then it can be made private and accessed
30226 through friendship. Otherwise it should be documented for
30227 public consumption.</p>
30228 <p><b>Suggestion</b></p>
30229 <p>Declare the constructor as private with a
30230 note about intended friendship, or remove the
30231 exposition-only comment and document the semantics.</p>
30232 <p><b>Notes</b></p>
30233 <p>Create an issue. Assigned to Detlef. Suggested resolution probably makes
30242 Pending a paper from Anthony Williams / Detleff Volleman.
30247 <p><b>Proposed resolution:</b></p>
30254 <h3><a name="1161"></a>1161. Unnecessary <tt>unique_future</tt> limitations</h3>
30255 <p><b>Section:</b> 30.6.5 [futures.unique_future] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
30256 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-17</p>
30257 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#futures.unique_future">active issues</a> in [futures.unique_future].</p>
30258 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#futures.unique_future">issues</a> in [futures.unique_future].</p>
30259 <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>
30260 <p><b>Discussion:</b></p>
30262 <p><b>Addresses UK 336</b></p>
30264 <p><b>Description</b></p>
30267 to transfer ownership of the asynchronous result from one
30268 unique_future instance to another via the move-constructor.
30269 However, it is not possible to transfer it back, and nor is
30270 it possible to create a default-constructed unique_future
30271 instance to use as a later move target. This unduly limits
30272 the use of <tt>unique_future</tt> in code. Also, the lack of a
30273 move-assignment operator restricts the use of <tt>unique_future</tt>
30274 in containers such as <tt>std::vector</tt> - <tt>vector::insert</tt> requires
30275 move-assignable for example.</p>
30276 <p><b>Suggestion</b></p>
30277 <p>Add a default constructor with the
30278 semantics that it creates a <tt>unique_future</tt> with no
30279 associated asynchronous result. Add a move-assignment
30280 operator which transfers ownership.</p>
30281 <p><b>Notes</b></p>
30282 <p>Create an issue. Detlef will look into it.</p>
30290 Pending a paper from Anthony Williams / Detleff Volleman.
30295 <p><b>Proposed resolution:</b></p>
30302 <h3><a name="1162"></a>1162. <tt>shared_future</tt> should support an efficient move constructor</h3>
30303 <p><b>Section:</b> 30.6.6 [future.shared_future] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
30304 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-17</p>
30305 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#future.shared_future">active issues</a> in [future.shared_future].</p>
30306 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#future.shared_future">issues</a> in [future.shared_future].</p>
30307 <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>
30308 <p><b>Discussion:</b></p>
30310 <p><b>Addresses UK 337</b></p>
30312 <p><b>Description</b></p>
30313 <p><tt>shared_future</tt>
30314 should support an efficient move constructor that can avoid
30315 unnecessary manipulation of a reference count, much like
30316 <tt>shared_ptr</tt></p>
30317 <p><b>Suggestion</b></p>
30318 <p>Add a move constructor</p>
30319 <p><b>Notes</b></p>
30320 <p>Create an issue. Detlef will look into it.</p>
30328 Pending a paper from Anthony Williams / Detleff Volleman.
30333 <p><b>Proposed resolution:</b></p>
30340 <h3><a name="1163"></a>1163. <tt>shared_future</tt> is inconsistent with <tt>shared_ptr</tt></h3>
30341 <p><b>Section:</b> 30.6.6 [future.shared_future] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
30342 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-17</p>
30343 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#future.shared_future">active issues</a> in [future.shared_future].</p>
30344 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#future.shared_future">issues</a> in [future.shared_future].</p>
30345 <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>
30346 <p><b>Discussion:</b></p>
30348 <p><b>Addresses UK 338</b></p>
30350 <p><b>Description</b></p>
30352 <p><tt>shared_future</tt> is currently
30353 CopyConstructible, but not CopyAssignable. This is
30354 inconsistent with <tt>shared_ptr</tt>, and will surprise users.
30355 Users will then write work-arounds to provide this
30356 behaviour. We should provide it simply and efficiently as
30357 part of shared_future. Note that since the shared_future
30358 member functions for accessing the state are all declared
30359 const, the original usage of an immutable shared_future
30360 value that can be freely copied by multiple threads can be
30361 retained by declaring such an instance as "<tt>const
30362 shared_future</tt>".</p>
30363 <p><b>Suggestion</b></p>
30364 <p>Remove "=delete"
30365 from the copy-assignment operator of shared_future. Add a
30366 move-constructor <tt>shared_future(shared_future&&
30367 rhs)</tt>, and a move-assignment operator <tt>shared_future&
30368 operator=(shared_future&& rhs)</tt>. The postcondition
30369 for the copy-assignment operator is that <tt>*this</tt> has the same
30370 associated state as <tt>rhs</tt>. The postcondition for the
30371 move-constructor and move assignment is that <tt>*this</tt> has the
30372 same associated as <tt>rhs</tt> had before the
30373 constructor/assignment call and that <tt>rhs</tt> has no associated
30375 <p><b>Notes</b></p>
30376 <p>Create an issue. Detlef will look into it.</p>
30384 Pending a paper from Anthony Williams / Detleff Volleman.
30389 <p><b>Proposed resolution:</b></p>
30396 <h3><a name="1165"></a>1165. Unneeded promise move constructor</h3>
30397 <p><b>Section:</b> 30.6.4 [futures.promise] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>
30398 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-17</p>
30399 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#futures.promise">active issues</a> in [futures.promise].</p>
30400 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#futures.promise">issues</a> in [futures.promise].</p>
30401 <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>
30402 <p><b>Discussion:</b></p>
30404 <p><b>Addresses UK 343</b></p>
30406 <p><b>Description</b></p>
30407 <p>The move constructor of a std::promise
30408 object does not need to allocate any memory, so the
30409 move-construct-with-allocator overload of the constructor
30410 is superfluous.</p>
30411 <p><b>Suggestion</b></p>
30413 constructor with the signature <tt>template <class
30414 Allocator> promise(allocator_arg_t, const Allocator&
30415 a, promise& rhs);</tt></p>
30416 <p><b>Notes</b></p>
30417 <p>Create an issue. Detlef will look into it. Will solicit feedback from Pablo.
30418 Note that “rhs” argument should also be an rvalue reference in any case.</p>
30426 Pending a paper from Anthony Williams / Detleff Volleman.
30431 <p><b>Proposed resolution:</b></p>
30438 <h3><a name="1166"></a>1166. Allocator-specific move/copy break model of move-constructor and
30439 move-assignment</h3>
30440 <p><b>Section:</b> X [allocator.propagation], X [allocator.propagation.map], 23 [containers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30441 <b>Submitter:</b> LWG <b>Opened:</b> 2009-06-28 <b>Last modified:</b> 2009-07-04</p>
30442 <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>
30443 <p><b>Discussion:</b></p>
30445 <p><b>Addresses US 77</b></p>
30447 <p><b>Description</b></p>
30448 <p>Allocator-specific move and copy behavior for containers
30449 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2525.pdf">N2525</a>) complicates a little-used and already-complicated
30450 portion of the standard library (allocators), and breaks
30451 the conceptual model of move-constructor and
30452 move-assignment operations on standard containers being
30453 efficient operations. The extensions for allocator-specific
30454 move and copy behavior should be removed from the working
30457 introduction of rvalue references, we are teaching
30458 programmers that moving from a standard container (e.g., a
30459 <tt>vector<string></tt>) is an efficient, constant-time
30460 operation. The introduction of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2525.pdf">N2525</a> removed that
30461 guarantee; depending on the behavior of four different
30462 traits (20.8.4), the complexity of copy and move operations
30463 can be constant or linear time. This level of customization
30464 greatly increases the complexity of standard containers,
30465 and benefits only a tiny fraction of the C++ community.</p>
30466 <p><b>Suggestion</b></p>
30468 <p>Remove 20.8.4.</p>
30470 <p>Remove 20.8.5.</p>
30472 <p>Remove all references to the facilities in
30473 20.8.4 and 20.8.5 from clause 23.</p>
30478 <p><b>Proposed resolution:</b></p>
30485 <h3><a name="1169"></a>1169. <tt>num_get</tt> not fully compatible with <tt>strto*</tt></h3>
30486 <p><b>Section:</b> 22.4.2.1.2 [facet.num.get.virtuals] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30487 <b>Submitter:</b> Cosmin Truta <b>Opened:</b> 2009-07-04 <b>Last modified:</b> 2009-07-07</p>
30488 <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>
30489 <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>
30490 <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>
30491 <p><b>Discussion:</b></p>
30493 As specified in the latest draft,
30494 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf">N2914</a>,
30495 <code>num_get</code> is still not fully compatible with the following C
30496 functions: <code>strtoul</code>, <code>strtoull</code>,
30497 <code>strtof</code> and
30498 <code>strtod</code>.
30501 In C, when conversion of a string to an unsigned integer type falls
30503 representable range, <code>strtoul</code> and <code>strtoull</code> return
30504 <code>ULONG_MAX</code> and <code>ULLONG_MAX</code>, respectively,
30506 whether the input field represents a positive or a negative value.
30507 On the other hand, the result of <code>num_get</code> conversion of
30509 values to unsigned integer types is zero. This raises a compatibility
30513 Moreover, in C, when conversion of a string to a floating-point type falls
30514 outside the representable range, <code>strtof</code>, <code>strtod</code>
30516 <code>strtold</code> return <code>±HUGE_VALF</code>,
30517 <code>±HUGE_VAL</code> and <code>±HUGE_VALL</code>, respectively.
30518 On the other hand, the result of <code>num_get</code> conversion of such
30519 out-of-range floating-point values results in the most positive/negative
30520 representable value.
30521 Although many C library implementations do implement <code>HUGE_VAL</code>
30522 (etc.) as the highest representable (which is, usually, the infinity),
30524 isn't required by the C standard. The C library specification makes no
30525 statement regarding the value of <code>HUGE_VAL</code> and friends, which
30526 potentially raises the same compatibility issue as in the above case of
30528 In addition, neither C nor C++ define symbolic constants for the maximum
30529 representable floating-point values (they only do so only for the maximum
30530 representable <i>finite</i> floating-point values), which raises a
30532 issue (it would be hard for the programmer to check the result of
30533 <code>num_get</code> against overflow).
30536 As such, we propose to adjust the specification of <code>num_get</code> to
30537 closely follow the behavior of all of its underlying C functions.
30541 <p><b>Proposed resolution:</b></p>
30544 Change 22.4.2.1.2 [facet.num.get.virtuals] as follows:
30549 The sequence of <code>char</code>s accumulated in stage 2 (the field) is
30550 converted to a numeric value by the rules of one of the functions declared in
30551 the header <code><cstdlib></code>:
30554 <li>For a signed integer value, the function <code>strtoll</code>.</li>
30555 <li>For an unsigned integer value, the function <code>strtoull</code>.</li>
30556 <li><ins>For a <code>float</code> value, the function
30557 <code>strtof</code>.</ins></li>
30558 <li><ins>For a <code>double</code> value, the function
30559 <code>strtod</code>.</ins></li>
30560 <li>For a <del>floating-point</del> <ins><code>long double</code></ins>
30561 value, the function <code>strtold</code>.</li>
30564 The numeric value to be stored can be one of:
30567 <li>zero, if the conversion function fails to convert the entire field.
30568 <del><code>ios_base::failbit</code> is assigned to <code>err</code>.</del></li>
30569 <li>the most positive <ins>(or negative)</ins> representable value, if
30570 the field <ins>to be converted to a signed integer type</ins> represents a
30571 value too large positive <ins>(or negative)</ins> to be represented in
30573 <del><code>ios_base::failbit</code> is assigned to <code>err</code>.</del></li>
30574 <li><del>the most negative representable value or zero for an unsigned integer
30575 type, if the field represents a value too large negative to be represented
30576 in <code>val</code>.
30577 <code>ios_base::failbit</code> is assigned to <code>err</code>.</del></li>
30578 <li><ins>the most positive representable value, if the field to be converted to
30579 an unsigned integer type represents a value that cannot be represented in
30580 <code>val</code>.</ins></li>
30581 <li>the converted value, otherwise.</li>
30584 The resultant numeric value is stored in <code>val</code>.
30585 <ins>If the conversion function fails to convert the entire field, or if the
30586 field represents a value outside the range of representable values,
30587 <code>ios_base::failbit</code> is assigned to <code>err</code>.</ins>
30597 <h3><a name="1170"></a>1170. String <i>char-like types</i> no longer PODs</h3>
30598 <p><b>Section:</b> 21.1 [strings.general] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30599 <b>Submitter:</b> Beman Dawes <b>Opened:</b> 2009-06-22 <b>Last modified:</b> 2009-07-28</p>
30600 <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>
30601 <p><b>Discussion:</b></p>
30603 <p>Prior to the introduction of constant expressions into the library,
30604 <tt>basic_string</tt> elements had to be POD types, and thus had to be both trivially
30605 copyable and standard-layout. This ensured that they could be memcpy'ed and
30606 would be compatible with other libraries and languages, particularly the C
30607 language and its library.</p>
30609 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2349.pdf">N2349</a>,
30610 Constant Expressions in the Standard Library Revision 2, changed the
30611 requirement in 21/1 from "POD type" to "literal type". That change had the
30612 effect of removing the trivially copyable and standard-layout requirements from
30613 <tt>basic_string</tt> elements.</p>
30614 <p>This means that <tt>basic_string</tt> elements no longer are guaranteed to be
30615 memcpy'able, and are no longer guaranteed to be standard-layout types:</p>
30617 <p>3.9/p2 and 3.9/p3 both make it clear that a "trivially copyable type" is
30618 required for memcpy to be guaranteed to work.</p>
30619 <p>Literal types (3.9p12) may have a non-trivial copy assignment operator, and
30620 that violates the trivially copyable requirements given in 9/p 6, bullet item
30622 <p>Literal types (3.9p12) have no standard-layout requirement, either.</p>
30624 <p>This situation probably arose because the wording for "Constant Expressions
30625 in the Standard Library" was in process at the same time the C++ POD
30626 deconstruction wording was in process. </p>
30627 <p>Since trivially copyable types meet the C++0x requirements for literal types,
30628 and thus work with constant expressions, it seems an easy fix to revert the
30629 <tt>basic_string</tt> element wording to its original state.</p>
30632 2009-07-28 Alisdair adds:
30637 When looking for any resolution for this issue, consider the definition of
30638 "character container type" in 17.3.4 [defns.character.container]. This
30639 does require the character type to be a POD, and this term is used in a
30640 number of places through clause 21 and 28. This suggests the PODness
30641 constraint remains, but is much more subtle than before. Meanwhile, I
30642 suspect the change from POD type to literal type was intentional with
30643 the assumption that trivially copyable types with
30644 non-trivial-but-constexpr constructors should serve as well. I don't
30645 believe the current wording offers the right guarantees for either of
30651 <p><b>Proposed resolution:</b></p>
30653 <p><i>Change General 21.1 [strings.general] as indicated:</i></p>
30655 <p>This Clause describes components for manipulating sequences of any <del>literal</del> <ins>POD</ins>
30656 (3.9) type. In this Clause
30657 such types are called <i>char-like types</i>, and objects of char-like types are
30658 called <i>char-like objects</i> or simply <i>characters</i>.</p>
30667 <h3><a name="1171"></a>1171. duration types shoud be literal</h3>
30668 <p><b>Section:</b> 20.9.3 [time.duration] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30669 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-07-06 <b>Last modified:</b> 2009-07-07</p>
30670 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#time.duration">active issues</a> in [time.duration].</p>
30671 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.duration">issues</a> in [time.duration].</p>
30672 <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>
30673 <p><b>Discussion:</b></p>
30675 The <tt>duration</tt> types in 20.9.3 [time.duration] are exactly the sort of type
30676 that should be "literal types" in the new standard. Likewise,
30677 arithmetic operations on <tt>duration</tt>s should be declared <tt>constexpr</tt>.
30681 <p><b>Proposed resolution:</b></p>
30683 Add <tt>constexpr</tt> to declaration of following functions and constructors:
30691 <b>Header <tt><chrono></tt> synopsis</b>
30694 <p><i>[Draughting note - observe switch to pass-by-value to support constexpr]</i></p>
30697 <pre><i>// duration arithmetic</i>
30698 template <class Rep1, class Period1, class Rep2, class Period2>
30699 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
30700 <ins>constexpr</ins> operator+(<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30701 template <class Rep1, class Period1, class Rep2, class Period2>
30702 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
30703 <ins>constexpr</ins> operator-(<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30704 template <class Rep1, class Period, class Rep2>
30705 duration<typename common_type<Rep1, Rep2>::type, Period>
30706 <ins>constexpr</ins> operator*(<del>const</del> duration<Rep1, Period><del>&</del> d, <del>const</del> Rep2<del>&</del> s);
30707 template <class Rep1, class Period, class Rep2>
30708 duration<typename common_type<Rep1, Rep2>::type, Period>
30709 <ins>constexpr</ins> operator*(<del>const</del> Rep1<del>&</del> s, <del>const</del> duration<Rep2, Period><del>&</del> d);
30710 template <class Rep1, class Period, class Rep2>
30711 duration<typename common_type<Rep1, Rep2>::type, Period>
30712 <ins>constexpr</ins> operator/(<del>const</del> duration<Rep1, Period><del>&</del> d, <del>const</del> Rep2<del>&</del> s);
30713 template <class Rep1, class Period1, class Rep2, class Period2>
30714 typename common_type<Rep1, Rep2>::type
30715 <ins>constexpr</ins> operator/(<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30717 <i>// duration comparisons</i>
30718 template <class Rep1, class Period1, class Rep2, class Period2>
30719 <ins>constexpr</ins> bool operator==(<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30720 template <class Rep1, class Period1, class Rep2, class Period2>
30721 <ins>constexpr</ins> bool operator!=(<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30722 template <class Rep1, class Period1, class Rep2, class Period2>
30723 <ins>constexpr</ins> bool operator< (<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30724 template <class Rep1, class Period1, class Rep2, class Period2>
30725 <ins>constexpr</ins> bool operator<=(<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30726 template <class Rep1, class Period1, class Rep2, class Period2>
30727 <ins>constexpr</ins> bool operator> (<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30728 template <class Rep1, class Period1, class Rep2, class Period2>
30729 <ins>constexpr</ins> bool operator>=(<del>const</del> duration<Rep1, Period1><del>&</del> lhs, <del>const</del> duration<Rep2, Period2><del>&</del> rhs);
30731 <i>// duration_cast</i>
30732 template <class ToDuration, class Rep, class Period>
30733 <ins>constexpr</ins> ToDuration duration_cast(<del>const</del> duration<Rep, Period><del>&</del> d);
30737 <b>20.9.3 [time.duration]</b>
30740 <pre>template <class Rep, class Period = ratio<1>>
30744 <i>// 20.9.3.1, construct/copy/destroy:</i>
30745 <ins>constexpr</ins> duration() = default;
30747 template <class Rep2>
30748 <ins>constexpr</ins> explicit duration(const Rep2& r);
30749 template <class Rep2, class Period2>
30750 <ins>constexpr</ins> duration(const duration<Rep2, Period2>& d);
30752 <ins>constexpr</ins> duration(const duration&) = default;
30754 <i>// 20.9.3.2, observer:</i>
30755 <ins>constexpr</ins> rep count() const;
30757 <i>// 20.9.3.3, arithmetic:</i>
30758 <ins>constexpr</ins> duration operator+() const;
30759 <ins>constexpr</ins> duration operator-() const;
30766 Note - this edit already seems assumed by definition of the duration static members <tt>zero/min/max</tt>.
30767 They cannot meaningfully be <tt>constexpr</tt> without this change.
30776 <h3><a name="1172"></a>1172. <tt>select_on_container_(copy|move)_construction</tt> over-constrained</h3>
30777 <p><b>Section:</b> 20.8.2.4 [allocator.concepts.members] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30778 <b>Submitter:</b> Alberto Ganesh Barbati <b>Opened:</b> 2009-07-08 <b>Last modified:</b> 2009-07-14</p>
30779 <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>
30780 <p><b>Discussion:</b></p>
30782 I believe the two functions
30783 <tt>select_on_container_(copy|move)_construction()</tt> are over-constrained. For
30784 example, the return value of the "copy" version is (see
30785 20.8.2.4 [allocator.concepts.members]/21):
30788 <i>Returns:</i> <tt>x</tt> if the allocator should propagate from the existing
30789 container to the new container on copy construction, otherwise <tt>X()</tt>.
30792 Consider the case where a user decides to provide an explicit concept
30793 map for Allocator to adapt some legacy allocator class, as he wishes to
30794 provide customizations that the <tt>LegacyAllocator</tt> concept map template
30795 does not provide. Now, although it's true that the legacy class is
30796 required to have a default constructor, the user might have reasons to
30797 prefer a different constructor to implement
30798 <tt>select_on_container_copy_construction()</tt>. However, the current wording
30799 requires the use of the default constructor.
30802 Moreover, it's not said explicitly that <tt>x</tt> is supposed to be the
30803 allocator of the existing container. A clarification would do no harm.
30807 <p><b>Proposed resolution:</b></p>
30809 Replace 20.8.2.4 [allocator.concepts.members]/21 with:
30812 <blockquote><pre>X select_on_container_copy_construction(const X& x);
30815 -21- <i>Returns:</i> <del><tt>x</tt> if the allocator should propagate from the existing
30816 container to the new container on copy construction, otherwise <tt>X()</tt>.</del>
30817 <ins>an allocator object to be used by the new container on copy
30818 construction. [<i>Note:</i> <tt>x</tt> is the allocator of the existing container that
30819 is being copied. The most obvious choices for the return value are <tt>x</tt>, if
30820 the allocator should propagate from the existing container, and <tt>X()</tt>.
30821 <i>— end note</i>]</ins>
30826 Replace 20.8.2.4 [allocator.concepts.members]/25 with:
30829 <blockquote><pre>X select_on_container_move_construction(X&& x);
30832 -25- <i>Returns:</i> <del><tt>move(x)</tt> if the allocator should propagate from the existing
30833 container to the new container on move construction, otherwise <tt>X()</tt>.</del>
30834 <ins>an allocator object to be used by the new container on move
30835 construction. [<i>Note:</i> <tt>x</tt> is the allocator of the existing container that
30836 is being moved. The most obvious choices for the return value are <tt>move(x)</tt>, if
30837 the allocator should propagate from the existing container, and <tt>X()</tt>.
30838 <i>— end note</i>]</ins>
30848 <h3><a name="1173"></a>1173. "Equivalence" wishy-washiness</h3>
30849 <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>
30850 <b>Submitter:</b> David Abrahams <b>Opened:</b> 2009-07-14 <b>Last modified:</b> 2009-07-14</p>
30851 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#library">active issues</a> in [library].</p>
30852 <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>
30853 <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>
30854 <p><b>Discussion:</b></p>
30856 Issue: The <tt>CopyConstructible</tt> requirements are wishy-washy. It requires
30857 that the copy is "equivalent" to the original, but "equivalent" is never
30861 I believe this to be an example of a more general lack of rigor around
30862 copy and assignment, although I haven't done the research to dig up all
30866 It's a problem because if you don't know what <tt>CopyConstructible</tt> means,
30867 you also don't know what it means to copy a pair of <tt>CopyConstructible</tt>
30868 types. It doesn't prevent us from writing code, but it is a hole in our
30869 ability to understand the meaning of copy.
30872 Furthermore, I'm pretty sure that vector's copy constructor doesn't
30873 require the elements to be <tt>EqualityComparable</tt>, so that table is actually
30874 referring to some ill-defined notion of equivalence when it uses ==.
30878 <p><b>Proposed resolution:</b></p>
30885 <h3><a name="1174"></a>1174. type property predicates</h3>
30886 <p><b>Section:</b> 20.6.4.3 [meta.unary.prop] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30887 <b>Submitter:</b> Jason Merrill <b>Opened:</b> 2009-07-16 <b>Last modified:</b> 2009-07-17</p>
30888 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#meta.unary.prop">active issues</a> in [meta.unary.prop].</p>
30889 <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>
30890 <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>
30891 <p><b>Discussion:</b></p>
30893 I've been implementing compiler support for <tt>is_standard_layout</tt>, and
30894 noticed a few nits about 20.6.4.3 [meta.unary.prop]:
30899 There's no trait for "trivially copyable type", which is now the
30900 property that lets you do bitwise copying of a type, and therefore seems
30901 useful to be able to query. <tt>has_trivial_assign</tt> &&
30902 <tt>has_trivial_copy_constructor</tt> && <tt>has_trivial_destructor</tt>
30904 not identical, specifically with respect to const types.
30907 <tt>has_trivial_copy_constructor</tt> and <tt>has_trivial_assign</tt> lack the "or an
30908 array of such a class type" language that most other traits in that
30909 section, including <tt>has_nothrow_copy_constructor</tt> and <tt>has_nothrow_assign</tt>,
30910 have; this seems like an oversight.
30915 See the thread starting with c++std-lib-24420 for further discussion.
30921 <p><b>Proposed resolution:</b></p>
30930 <h3><a name="1175"></a>1175. <tt>unordered</tt> complexity</h3>
30931 <p><b>Section:</b> 23.2.5 [unord.req] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30932 <b>Submitter:</b> Pablo Halpern <b>Opened:</b> 2009-07-17 <b>Last modified:</b> 2009-07-19</p>
30933 <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>
30934 <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>
30935 <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>
30936 <p><b>Discussion:</b></p>
30938 When I look at the <tt>unordered_*</tt> constructors, I think the complexity is poorly
30939 described and does not follow the style of the rest of the standard.
30943 The complexity for the default constructor is specified as constant.
30944 Actually, it is proportional to <tt>n</tt>, but there are no invocations of
30945 <tt>value_type</tt> constructors or other <tt>value_type</tt> operations.
30949 For the iterator-based constructor the complexity should be:
30953 <i>Complexity:</i> exactly <tt>n</tt> calls to construct <tt>value_type</tt>
30954 from <tt>InputIterator::value_type</tt> (where <tt>n = distance(f,l)</tt>).
30955 The number of calls to <tt>key_equal::operator()</tt> is proportional to
30956 <tt>n</tt> in the average case and <tt>n*n</tt> in the worst case.
30961 <p><b>Proposed resolution:</b></p>
30970 <h3><a name="1176"></a>1176. Make <tt>thread</tt> constructor non-variadic</h3>
30971 <p><b>Section:</b> 30.3.1.2 [thread.thread.constr] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
30972 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-07-18 <b>Last modified:</b> 2009-07-18</p>
30973 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#thread.thread.constr">active issues</a> in [thread.thread.constr].</p>
30974 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#thread.thread.constr">issues</a> in [thread.thread.constr].</p>
30975 <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>
30976 <p><b>Discussion:</b></p>
30978 The variadic <tt>thread</tt> constructor is causing controversy, e.g.
30979 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2901.pdf">N2901</a>.
30980 This issue has been created as a placeholder for this course of action.
30983 <blockquote><pre>template <class F<del>, class ...Args</del>> thread(F&& f<del>, Args&&... args</del>);
30984 </pre></blockquote>
30987 See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#929">929</a> for wording which specifies an rvalue-ref signature but
30988 with "decay behavior", but using variadics.
30992 <p><b>Proposed resolution:</b></p>
31001 <h3><a name="1177"></a>1177. Improve "diagnostic required" wording</h3>
31002 <p><b>Section:</b> 20.9.3 [time.duration] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
31003 <b>Submitter:</b> Howard Hinnant <b>Opened:</b> 2009-07-18 <b>Last modified:</b> 2009-08-01</p>
31004 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#time.duration">active issues</a> in [time.duration].</p>
31005 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#time.duration">issues</a> in [time.duration].</p>
31006 <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>
31007 <p><b>Discussion:</b></p>
31009 "diagnostic required" has been used (by me) for code words meaning "use
31010 <tt>enable_if</tt> to constrain templated functions. This needs to be
31011 improved by referring to the function signature as not participating in
31012 the overload set, and moving this wording to a <i>Remarks</i> paragraph.
31017 <p><b>Proposed resolution:</b></p>
31019 This proposed resolution addresses <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#947">947</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#974">974</a>.
31024 Change 20.9.3.1 [time.duration.cons]:
31028 <pre>template <class Rep2>
31029 explicit duration(const Rep2& r);
31033 <i><del>Requires:</del> <ins>Remarks:</ins></i>
31034 <tt>Rep2</tt> shall be implicitly convertible to <tt>rep</tt> and
31038 <tt>treat_as_floating_point<rep>::value</tt> shall be <tt>true</tt> or
31041 <tt>treat_as_floating_point<Rep2>::value</tt> shall be <tt>false</tt>.
31045 <del>Diagnostic required</del> <ins>If these constraints are not met, this
31046 constructor shall not participate in overload resolution</ins>. [<i>Example:</i>
31048 <blockquote><pre>duration<int, milli> d(3); // OK
31049 duration<int, milli> d(3.5); // error
31050 </pre></blockquote>
31053 — <i>end example</i>]
31057 <i>Effects:</i> Constructs an object of type <tt>duration</tt>.
31061 <i>Postcondition:</i> <tt>count() == static_cast<rep>(r)</tt>.
31066 <pre>template <class Rep2, class Period2>
31067 duration(const duration<Rep2, Period2>& d);
31071 <i><del>Requires:</del> <ins>Remarks:</ins></i> <tt>treat_as_floating_point<rep>::value</tt> shall be <tt>true</tt> or
31072 <tt>ratio_divide<Period2, period>::type::den</tt> shall be 1<del>. Diagnostic
31073 required</del><ins>, else this constructor shall not participate in overload
31074 resolution</ins>. [<i>Note:</i> This requirement prevents implicit truncation error
31075 when converting between integral-based duration types. Such a
31076 construction could easily lead to confusion about the value of the
31077 duration. — <i>end note</i>] [<i>Example:</i>
31080 <blockquote><pre>duration<int, milli> ms(3);
31081 duration<int, micro> us = ms; // OK
31082 duration<int, milli> ms2 = us; // error
31083 </pre></blockquote>
31086 — <i>end example</i>]
31090 <i>Eff�ects:</i> Constructs an object of type <tt>duration</tt>, constructing
31092 <tt>duration_cast<duration>(d).count()</tt>.
31101 Change the following paragraphs in 20.9.3.5 [time.duration.nonmember]:
31105 <pre>template <class Rep1, class Period, class Rep2>
31106 duration<typename common_type<Rep1, Rep2>::type, Period>
31107 operator*(const duration<Rep1, Period>& d, const Rep2& s);
31110 <i><del>Requires</del> <ins>Remarks</ins>:</i> <tt>Rep2</tt> shall be implicitly convertible to
31111 <tt>CR(Rep1, Rep2)</tt><ins>, else this signature shall not participate in
31112 overload resolution</ins>. <del>Diagnostic required.</del>
31115 <pre>template <class Rep1, class Period, class Rep2>
31116 duration<typename common_type<Rep1, Rep2>::type, Period>
31117 operator*(const Rep1& s, const duration<Rep2, Period>& d);
31120 <i><del>Requires</del> <ins>Remarks</ins>:</i> <tt>Rep1</tt> shall be implicitly convertible to
31121 <tt>CR(Rep1, Rep2)</tt><ins>, else this signature shall not participate in
31122 overload resolution</ins>. <del>Diagnostic required.</del>
31125 <pre>template <class Rep1, class Period, class Rep2>
31126 duration<typename common_type<Rep1, Rep2>::type, Period>
31127 operator/(const duration<Rep1, Period>& d, const Rep2& s);
31130 <i><del>Requires</del> <ins>Remarks</ins>:</i> <tt>Rep2</tt> shall be implicitly convertible to
31131 <tt>CR(Rep1, Rep2)</tt> and <tt>Rep2</tt> shall not be an instantiation of
31132 <tt>duration</tt><ins>, else this signature shall not participate in
31133 overload resolution</ins>. <del>Diagnostic required.</del>
31136 <pre>template <class Rep1, class Period, class Rep2>
31137 duration<typename common_type<Rep1, Rep2>::type, Period>
31138 operator%(const duration<Rep1, Period>& d, const Rep2& s);
31141 <i><del>Requires</del> <ins>Remarks</ins>:</i> <tt>Rep2</tt> shall be implicitly convertible to
31142 <tt>CR(Rep1, Rep2)</tt> and <tt>Rep2</tt> shall not be an instantiation of
31143 <tt>duration</tt><ins>, else this signature shall not participate in
31144 overload resolution</ins>. <del>Diagnostic required.</del>
31155 <h3><a name="1178"></a>1178. Header dependencies</h3>
31156 <p><b>Section:</b> 17.6.4.2 [res.on.headers] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>
31157 <b>Submitter:</b> Beman Dawes <b>Opened:</b> 2009-07-18 <b>Last modified:</b> 2009-07-18</p>
31158 <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>
31159 <p><b>Discussion:</b></p>
31161 See Frankfurt notes of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#1001">1001</a>.
31165 <p><b>Proposed resolution:</b></p>
31166 <p><i>Change 17.6.4.2 [res.on.headers], Headers, paragraph 1, as indicated:</i></p>
31171 A C++ header may include other C++
31172 headers.<del><sup>[footnote]</sup></del> <ins>A C++ header shall provide
31173 the declarations and definitions that appear in its synopsis
31174 (3.2 [basic.def.odr]). A C++ header shown in its synopsis as including
31175 other C++ headers shall provide the declarations and definitions that appear in
31176 the synopses of those other headers.</ins>
31179 <p><del><sup>[footnote]</sup> C++ headers must include a C++ header that contains
31180 any needed definition (3.2).</del></p>
31189 <h3><a name="1179"></a>1179. Probably editorial in [structure.specifications]</h3>
31190 <p><b>Section:</b> 17.5.1.4 [structure.specifications] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
31191 <b>Submitter:</b> Robert Klarer <b>Opened:</b> 2009-07-21 <b>Last modified:</b> 2009-07-22</p>
31192 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#structure.specifications">issues</a> in [structure.specifications].</p>
31193 <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>
31194 <p><b>Discussion:</b></p>
31196 While reviewing <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#971">971</a> I noted that 17.5.1.4 [structure.specifications]/7 says:
31200 -7- Error conditions specify conditions where a function may fail. The
31201 conditions are listed, together with a suitable explanation, as the <tt>enum
31202 class errc</tt> constants (19.5) that could be used as an argument to
31203 function <tt>make_error_condition</tt> (19.5.3.6).
31207 This paragraph should mention <tt>make_error_code</tt> or the text "that
31208 could be used as an argument to function <tt>make_error_condition</tt>
31209 (19.5.3.6)" should be deleted. I believe this is editorial.
31213 2009-07-21 Chris adds:
31219 I'm not convinced there's a problem there, because as far as the "Error
31220 conditions" clauses are concerned, make_error_condition() is used by a
31221 user to test for the condition, whereas make_error_code is not. For
31225 <blockquote><pre>void foobar(error_code& ec = throws());
31226 </pre></blockquote>
31232 permission_denied - Insufficient privilege to perform operation.
31236 When a user writes:
31239 <blockquote><pre>error_code ec;
31241 if (ec == errc::permission_denied)
31243 </pre></blockquote>
31246 the implicit conversion <tt>errc->error_condition</tt> makes the if-test
31250 <blockquote><pre>if (ec == make_error_condition(errc::permission_denied))
31251 </pre></blockquote>
31254 On the other hand, if the user had written:
31257 <blockquote><pre>if (ec == make_error_code(errc::permission_denied))
31258 </pre></blockquote>
31261 the test is now checking for a specific error code. The test may
31262 evaluate to <tt>false</tt> even though <tt>foobar()</tt> failed due to the documented
31263 error condition "Insufficient privilege".
31268 <p><b>Proposed resolution:</b></p>
31277 <h3><a name="1180"></a>1180. Missing string_type member typedef in class <tt>sub_match</tt></h3>
31278 <p><b>Section:</b> 28.9.1 [re.submatch.members] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
31279 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2009-07-25 <b>Last modified:</b> 2009-07-26</p>
31280 <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>
31281 <p><b>Discussion:</b></p>
31283 The definition of class template <tt>sub_match</tt> is strongly dependent
31284 on the type <tt>basic_string<value_type></tt>, both in interface and effects,
31285 but does not provide a corresponding typedef <tt>string_type</tt>, as e.g.
31286 class <tt>match_results</tt> does, which looks like an oversight to me that
31291 <p><b>Proposed resolution:</b></p>
31296 In the class template <tt>sub_match</tt> synopsis 28.9 [re.submatch]/1
31297 change as indicated:
31300 <blockquote><pre>template <class BidirectionalIterator>
31301 class sub_match : public std::pair<BidirectionalIterator, BidirectionalIterator> {
31303 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
31304 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
31305 typedef BidirectionalIterator iterator;
31306 <ins>typedef basic_string<value_type> string_type;</ins>
31310 difference_type length() const;
31311 operator <del>basic_string<value_type></del><ins>string_type</ins>() const;
31312 <del>basic_string<value_type></del><ins>string_type</ins> str() const;
31313 int compare(const sub_match& s) const;
31314 int compare(const <del>basic_string<value_type></del><ins>string_type</ins>& s) const;
31315 int compare(const value_type* s) const;
31317 </pre></blockquote>
31322 In 28.9.1 [re.submatch.members]/2 change as indicated:
31325 <blockquote><pre>operator <del>basic_string<value_type></del><ins>string_type</ins>() const;
31329 <i>Returns:</i> <tt>matched ? <del>basic_string<value_type></del>
31330 <ins>string_type</ins>(first, second) : <del>basic_string<value_type></del>
31331 <ins>string_type</ins>()</tt>.
31338 In 28.9.1 [re.submatch.members]/3 change as indicated:
31341 <blockquote><pre><del>basic_string<value_type></del><ins>string_type</ins> str() const;
31345 <i>Returns:</i> <tt>matched ? <del>basic_string<value_type></del>
31346 <ins>string_type</ins>(first, second) : <del>basic_string<value_type></del>
31347 <ins>string_type</ins>()</tt>.
31359 <h3><a name="1181"></a>1181. Invalid <tt>sub_match</tt> comparison operators</h3>
31360 <p><b>Section:</b> 28.9.2 [re.submatch.op] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
31361 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2009-07-25 <b>Last modified:</b> 2009-07-28</p>
31362 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#re.submatch.op">issues</a> in [re.submatch.op].</p>
31363 <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>
31364 <p><b>Discussion:</b></p>
31366 Several heterogeneous comparison operators of class template
31367 <tt>sub_match</tt> are specified by return clauses that are not valid
31368 in general. E.g. 28.9.2 [re.submatch.op]/7:
31371 <blockquote><pre>template <class BiIter, class ST, class SA>
31373 const basic_string<
31374 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31375 const sub_match<BiIter>& rhs);
31378 <i>Returns:</i> <tt>lhs == rhs.str()</tt>.
31383 The returns clause would be ill-formed for all cases where
31384 <tt>ST != std::char_traits<iterator_traits<BiIter>::value_type></tt>
31385 or <tt>SA != std::allocator<iterator_traits<BiIter>::value_type></tt>.
31388 The generic character of the comparison was intended, so
31389 there are basically two approaches to fix the problem: The
31390 first one would define the semantics of the comparison
31391 using the traits class <tt>ST</tt> (The semantic of <tt>basic_string::compare</tt>
31392 is defined in terms of the compare function of the corresponding
31393 traits class), the second one would define the semantics of the
31394 comparison using the traits class
31397 <blockquote><pre>std::char_traits<iterator_traits<BiIter>::value_type>
31398 </pre></blockquote>
31401 which is essentially identical to
31404 <blockquote><pre>std::char_traits<sub_match<BiIter>::value_type>
31405 </pre></blockquote>
31408 I suggest to follow the second approach, because
31409 this emphasizes the central role of the <tt>sub_match</tt>
31410 object as part of the comparison and would also
31411 make sure that a <tt>sub_match</tt> comparison using some
31412 <tt>basic_string<char_t, ..></tt> always is equivalent to
31413 a corresponding comparison with a string literal
31414 because of the existence of further overloads (beginning
31415 from 28.9.2 [re.submatch.op]/19). If users really want to
31416 take advantage of their own <tt>traits::compare</tt>, they can
31417 simply write a corresponding compare function that
31422 <p><b>Proposed resolution:</b></p>
31426 In 28.9.2 [re.submatch.op] change as indicated:
31433 If <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1180">1180</a> is accepted:
31437 <pre>template <class BiIter, class ST, class SA>
31439 const basic_string<
31440 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31441 const sub_match<BiIter>& rhs);
31444 7 <i>Returns:</i> <tt><del>lhs</del><ins>typename
31445 sub_match<BiIter>::string_type(lhs.begin(), lhs.end())</ins> ==
31449 <pre>template <class BiIter, class ST, class SA>
31451 const basic_string<
31452 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31453 const sub_match<BiIter>& rhs);
31457 8 <i>Returns:</i> <tt><del>lhs</del><ins>typename
31458 sub_match<BiIter>::string_type(lhs.begin(), lhs.end())</ins> !=
31462 <pre>template <class BiIter, class ST, class SA>
31464 const basic_string<
31465 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31466 const sub_match<BiIter>& rhs);
31470 9 <i>Returns:</i> <tt><del>lhs</del><ins>typename
31471 sub_match<BiIter>::string_type(lhs.begin(), lhs.end())</ins> <
31475 <pre>template <class BiIter, class ST, class SA>
31477 const basic_string<
31478 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31479 const sub_match<BiIter>& rhs);
31483 10 <i>Returns:</i> <tt><del>lhs</del><ins>typename
31484 sub_match<BiIter>::string_type(lhs.begin(), lhs.end())</ins> >
31488 <pre>template <class BiIter, class ST, class SA>
31489 bool operator>=(
31490 const basic_string<
31491 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31492 const sub_match<BiIter>& rhs);
31496 11 <i>Returns:</i> <tt><del>lhs</del><ins>typename
31497 sub_match<BiIter>::string_type(lhs.begin(), lhs.end())</ins> >=
31501 <pre>template <class BiIter, class ST, class SA>
31502 bool operator<=(
31503 const basic_string<
31504 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31505 const sub_match<BiIter>& rhs);
31509 12 <i>Returns:</i> <tt><del>lhs</del><ins>typename
31510 sub_match<BiIter>::string_type(lhs.begin(), lhs.end())</ins> <=
31514 <pre>template <class BiIter, class ST, class SA>
31515 bool operator==(const sub_match<BiIter>& lhs,
31516 const basic_string<
31517 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31521 13 <i>Returns:</i> <tt>lhs.str() == <del>rhs</del><ins>typename
31522 sub_match<BiIter>::string_type(rhs.begin(), rhs.end())</ins></tt>.
31525 <pre>template <class BiIter, class ST, class SA>
31526 bool operator!=(const sub_match<BiIter>& lhs,
31527 const basic_string<
31528 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31532 14 <i>Returns:</i> <tt>lhs.str() != <del>rhs</del><ins>typename
31533 sub_match<BiIter>::string_type(rhs.begin(), rhs.end())</ins></tt>.
31536 <pre>template <class BiIter, class ST, class SA>
31537 bool operator<(const sub_match<BiIter>& lhs,
31538 const basic_string<
31539 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31543 15 <i>Returns:</i> <tt>lhs.str() < <del>rhs</del><ins>typename
31544 sub_match<BiIter>::string_type(rhs.begin(), rhs.end())</ins></tt>.
31547 <pre>template <class BiIter, class ST, class SA>
31548 bool operator>(const sub_match<BiIter>& lhs,
31549 const basic_string<
31550 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31554 16 <i>Returns:</i> <tt>lhs.str() > <del>rhs</del><ins>typename
31555 sub_match<BiIter>::string_type(rhs.begin(), rhs.end())</ins></tt>.
31558 <pre>template <class BiIter, class ST, class SA>
31559 bool operator>=(const sub_match<BiIter>& lhs,
31560 const basic_string<
31561 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31565 17 <i>Returns:</i> <tt>lhs.str() >= <del>rhs</del><ins>typename
31566 sub_match<BiIter>::string_type(rhs.begin(), rhs.end())</ins></tt>.
31569 <pre>template <class BiIter, class ST, class SA>
31570 bool operator<=(const sub_match<BiIter>& lhs,
31571 const basic_string<
31572 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31576 18 <i>Returns:</i> <tt>lhs.str() <= <del>rhs</del><ins>typename
31577 sub_match<BiIter>::string_type(rhs.begin(), rhs.end())</ins></tt>.
31586 If <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1180">1180</a> is <em>not</em> accepted:
31590 <pre>template <class BiIter, class ST, class SA>
31592 const basic_string<
31593 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31594 const sub_match<BiIter>& rhs);
31597 7 <i>Returns:</i> <tt><del>lhs</del><ins>basic_string<typename
31598 sub_match<BiIter>::value_type>(lhs.begin(), lhs.end())</ins> ==
31602 <pre>template <class BiIter, class ST, class SA>
31604 const basic_string<
31605 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31606 const sub_match<BiIter>& rhs);
31610 8 <i>Returns:</i> <tt><del>lhs</del><ins>basic_string<typename
31611 sub_match<BiIter>::value_type>(lhs.begin(), lhs.end())</ins> !=
31615 <pre>template <class BiIter, class ST, class SA>
31617 const basic_string<
31618 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31619 const sub_match<BiIter>& rhs);
31623 9 <i>Returns:</i> <tt><del>lhs</del><ins>basic_string<typename
31624 sub_match<BiIter>::value_type>(lhs.begin(), lhs.end())</ins> <
31628 <pre>template <class BiIter, class ST, class SA>
31630 const basic_string<
31631 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31632 const sub_match<BiIter>& rhs);
31636 10 <i>Returns:</i> <tt><del>lhs</del><ins>basic_string<typename
31637 sub_match<BiIter>::value_type>(lhs.begin(), lhs.end())</ins> >
31641 <pre>template <class BiIter, class ST, class SA>
31642 bool operator>=(
31643 const basic_string<
31644 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31645 const sub_match<BiIter>& rhs);
31649 11 <i>Returns:</i> <tt><del>lhs</del><ins>basic_string<typename
31650 sub_match<BiIter>::value_type>(lhs.begin(), lhs.end())</ins> >=
31654 <pre>template <class BiIter, class ST, class SA>
31655 bool operator<=(
31656 const basic_string<
31657 typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
31658 const sub_match<BiIter>& rhs);
31662 12 <i>Returns:</i> <tt><del>lhs</del><ins>basic_string<typename
31663 sub_match<BiIter>::value_type>(lhs.begin(), lhs.end())</ins> <=
31667 <pre>template <class BiIter, class ST, class SA>
31668 bool operator==(const sub_match<BiIter>& lhs,
31669 const basic_string<
31670 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31674 13 <i>Returns:</i> <tt>lhs.str() == <del>rhs</del><ins>basic_string<typename
31675 sub_match<BiIter>::value_type>(rhs.begin(), rhs.end())</ins></tt>.
31678 <pre>template <class BiIter, class ST, class SA>
31679 bool operator!=(const sub_match<BiIter>& lhs,
31680 const basic_string<
31681 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31685 14 <i>Returns:</i> <tt>lhs.str() != <del>rhs</del><ins>basic_string<typename
31686 sub_match<BiIter>::value_type>(rhs.begin(), rhs.end())</ins></tt>.
31689 <pre>template <class BiIter, class ST, class SA>
31690 bool operator<(const sub_match<BiIter>& lhs,
31691 const basic_string<
31692 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31696 15 <i>Returns:</i> <tt>lhs.str() < <del>rhs</del><ins>basic_string<typename
31697 sub_match<BiIter>::value_type>(rhs.begin(), rhs.end())</ins></tt>.
31700 <pre>template <class BiIter, class ST, class SA>
31701 bool operator>(const sub_match<BiIter>& lhs,
31702 const basic_string<
31703 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31707 16 <i>Returns:</i> <tt>lhs.str() > <del>rhs</del><ins>basic_string<typename
31708 sub_match<BiIter>::value_type>(rhs.begin(), rhs.end())</ins></tt>.
31711 <pre>template <class BiIter, class ST, class SA>
31712 bool operator>=(const sub_match<BiIter>& lhs,
31713 const basic_string<
31714 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31718 17 <i>Returns:</i> <tt>lhs.str() >= <del>rhs</del><ins>basic_string<typename
31719 sub_match<BiIter>::value_type>(rhs.begin(), rhs.end())</ins></tt>.
31722 <pre>template <class BiIter, class ST, class SA>
31723 bool operator<=(const sub_match<BiIter>& lhs,
31724 const basic_string<
31725 typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
31729 18 <i>Returns:</i> <tt>lhs.str() <= <del>rhs</del><ins>basic_string<typename
31730 sub_match<BiIter>::value_type>(rhs.begin(), rhs.end())</ins></tt>.
31746 <h3><a name="1182"></a>1182. Unfortunate hash dependencies</h3>
31747 <p><b>Section:</b> 20.7.17 [unord.hash] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
31748 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-07-28 <b>Last modified:</b> 2009-07-30</p>
31749 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#unord.hash">active issues</a> in [unord.hash].</p>
31750 <p><b>View all other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html#unord.hash">issues</a> in [unord.hash].</p>
31751 <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>
31752 <p><b>Discussion:</b></p>
31754 The implied library dependencies created by spelling out all the <tt>hash</tt>
31755 template specializations in the <tt><functional></tt> synopsis are unfortunate.
31756 The potential coupling is greatly reduced if the <tt>hash</tt> specialization is
31757 declared in the appropriate header for each library type, as it is much
31758 simpler to forward declare the primary template and provide a single
31759 specialization than it is to implement a <tt>hash</tt> function for a <tt>string</tt> or
31760 <tt>vector</tt> without providing a definition for the whole <tt>string/vector</tt>
31761 template in order to access the necessary bits.
31765 Note that the proposed resolution purely involves moving the
31766 declarations of a few specializations, it specifically does not make any
31767 changes to 20.7.17 [unord.hash].
31771 <p><b>Proposed resolution:</b></p>
31773 Strike the following specializations declared in the <tt><functional></tt>
31774 synopsis p2 20.7 [function.objects]
31777 <blockquote><pre><del>template <> struct hash<std::string>;</del>
31778 <del>template <> struct hash<std::u16string>;</del>
31779 <del>template <> struct hash<std::u32string>;</del>
31780 <del>template <> struct hash<std::wstring>;</del>
31782 <del>template <class Allocator> struct hash<std::vector<bool, Allocator> >;</del>
31783 <del>template <std::size_t N> struct hash<std::bitset<N> >;</del>
31784 </pre></blockquote>
31787 Add the following declarations to the synopsis of <tt><string></tt> in
31788 21.3 [string.classes]
31791 <blockquote><pre><ins>// 21.4.x hash support
31792 template <class T> struct hash;
31793 template <> struct hash<string>;
31794 template <> struct hash<u16string>;
31795 template <> struct hash<u32string>;
31796 template <> struct hash<wstring>;</ins>
31797 </pre></blockquote>
31800 Add a new clause 21.4.X
31805 21.4.X Hash support [basic.string.hash]
31808 <pre>template <> struct hash<string>;
31809 template <> struct hash<u16string>;
31810 template <> struct hash<u32string>;
31811 template <> struct hash<wstring>;
31815 Explicit specializations of the class template hash (20.7.17 [unord.hash])
31816 shall be provided for the types <tt>string</tt>, <tt>u16string</tt>,
31817 <tt>u32string</tt> and <tt>wstring</tt> suitable for using these types as keys in
31818 unordered associative containers (23.5 [unord]).
31823 Add the following declarations to the synopsis of <tt><vector></tt> in
31827 <blockquote><pre><ins>
31828 // 21.4.x hash support
31829 template <class T> struct hash;
31830 template <class Allocator> struct hash<vector<bool, Allocator>>;
31831 </ins></pre></blockquote>
31834 Add a new paragraph to the end of 23.3.7 [vector.bool]
31837 <blockquote><pre>template <class Allocator> struct hash<vector<bool, Allocator>>;
31840 A partial specialization of the class template hash (20.7.17 [unord.hash])
31841 shall be provided for vectors of boolean values suitable for use as a key
31842 in unordered associative containers (23.5 [unord]).
31847 Add the following declarations to the synopsis of <tt><bitset></tt>
31848 in 20.3.6 [template.bitset]
31851 <blockquote><pre><ins>
31852 // 20.3.6.X hash support
31853 template <class T> struct hash;
31854 template <size_t N> struct hash<bitset<N> >;
31855 </ins></pre></blockquote>
31858 Add a new subclause 20.3.6.X [bitset.hash]
31863 20.3.6.X bitset hash support [bitset.hash]
31866 <pre>template <size_t N> struct hash<bitset<N> >;
31870 A partial specialization of the class template hash
31871 (20.7.17 [unord.hash]) shall be provided for bitsets suitable for use as a key in
31872 unordered associative containers (23.5 [unord]).
31882 <h3><a name="1183"></a>1183. <tt>basic_ios::set_rdbuf</tt> may break class invariants</h3>
31883 <p><b>Section:</b> 27.5.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>
31884 <b>Submitter:</b> Daniel Krügler <b>Opened:</b> 2009-07-28 <b>Last modified:</b> 2009-07-28</p>
31885 <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>
31886 <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>
31887 <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>
31888 <p><b>Discussion:</b></p>
31890 The protected member function <tt>set_rdbuf</tt> had been added during the
31891 process of adding move and swap semantics to IO classes. A relevant
31892 property of this function is described by it's effects in
31893 27.5.4.2 [basic.ios.members]/19:
31897 <i>Effects:</i> Associates the <tt>basic_streambuf</tt> object pointed to by sb with
31898 this stream without calling <tt>clear()</tt>.
31902 This means that implementors of or those who derive from existing IO classes
31903 could cause an internal state where the stream buffer could be 0, but the
31904 IO class has the state <tt>good()</tt>. This would break several currently existing
31905 implementations which rely on the fact that setting a stream buffer via the
31906 currently only ways, i.e. either by calling
31909 <blockquote><pre>void init(basic_streambuf<charT,traits>* sb);
31910 </pre></blockquote>
31916 <blockquote><pre>basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb);
31917 </pre></blockquote>
31920 to set <tt>rdstate()</tt> to <tt>badbit</tt>, if the buffer is 0. This has the effect that many
31921 internal functions can simply check <tt>rdstate()</tt> instead of <tt>rdbuf()</tt> for being 0.
31925 I therefore suggest that a requirement is added for callers of <tt>set_rdbuf</tt> to
31930 <p><b>Proposed resolution:</b></p>
31932 Change 27.5.4.2 [basic.ios.members] around p. 19 as indicated (The proposed
31933 resolution fixes also two editorial problems: Some wrong letters in "<tt>clear()</tt>"
31934 and moving the post conditions into a separate paragraph):
31937 <blockquote><pre>void set_rdbuf(basic_streambuf<charT, traits>* sb);
31942 <ins><i>Requires:</i> <tt>sb != nullptr</tt>.</ins>
31946 <i>Effects:</i> Associates the <tt>basic_streambuf</tt> object pointed to by <tt>sb</tt> with
31947 this stream without
31948 calling <tt>clear()</tt>. <del>Postconditions: rdbuf() == sb.</del>
31952 <ins><i>Postconditions:</i> <tt>rdbuf() == sb</tt>.</ins>
31956 <i>Throws:</i> Nothing.
31967 <h3><a name="1184"></a>1184. Feature request: dynamic bitset</h3>
31968 <p><b>Section:</b> 23.3.6 [vector] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
31969 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-07-29 <b>Last modified:</b> 2009-07-29</p>
31970 <p><b>View other</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index-open.html#vector">active issues</a> in [vector].</p>
31971 <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>
31972 <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>
31973 <p><b>Discussion:</b></p>
31975 Opened at Alisdair's request, steming from <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#96">96</a>.
31976 Alisdair recommends NAD Future.
31980 <p><b>Proposed resolution:</b></p>
31987 <h3><a name="1185"></a>1185. iterator categories and output iterators</h3>
31988 <p><b>Section:</b> X [iterator.requirements] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
31989 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-07-31 <b>Last modified:</b> 2009-07-31</p>
31990 <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>
31991 <p><b>Discussion:</b></p>
31993 (wording relative to
31994 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf">N2723</a>
31995 pending new working paper)
31999 According to p3 X [iterator.requirements], Forward iterators,
32000 Bidirectional iterators and Random Access iterators all satisfy the
32001 requirements for an Output iterator:
32005 XXX iterators satisfy all the requirements of the input and output iterators
32006 and can be used whenever either kind is specified ...
32010 Meanwhile, p4 goes on to contradict this:
32014 Besides its category, a forward, bidirectional, or random access
32015 iterator can also be mutable or constant...
32019 ... Constant iterators do not satisfy the requirements for output iterators
32023 The latter seems to be the overriding concern, as the iterator tag
32024 hierarchy does not define <tt>forward_iterator_tag</tt> as multiply derived from
32025 both <tt>input_iterator_tag</tt> and <tt>output_iterator_tag</tt>.
32029 The work on concepts for iterators showed us that output iterator really
32030 is fundamentally a second dimension to the iterator categories, rather
32031 than part of the linear input -> forward -> bidirectional ->
32032 random-access sequence. It would be good to clear up these words to
32033 reflect that, and separately list output iterator requirements in the
32034 requires clauses for the appropriate algorithms and operations.
32038 <p><b>Proposed resolution:</b></p>
32045 <h3><a name="1186"></a>1186. Forward list could model a stack</h3>
32046 <p><b>Section:</b> 23.3.5.3 [stack] <b>Status:</b> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>
32047 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2009-07-31 <b>Last modified:</b> 2009-08-01</p>
32048 <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>
32049 <p><b>Discussion:</b></p>
32051 The library template <tt>forward_list</tt> could easily model the idea of a
32052 <tt>stack</tt>, where the operations work on the front of the list rather than
32053 the back. However, the standard library <tt>stack</tt> adaptor cannot support
32058 It would be relatively easy to write a partial specialization for <tt>stack</tt>
32059 to support <tt>forward_list</tt>, but that opens the question of which header to
32060 place it in. A much better solution would be to add a <tt>concept_map</tt> for
32061 the <tt>StackLikeContainer</tt> concept to the <tt><forward_list></tt> header and then
32062 everything just works, including a user's own further uses in a
32063 stack-like context.
32067 Therefore while I am submitting the issue now so that it is on record, I
32068 <em>strongly recommend</em> we resolve as "NAD Concepts" as any non-concepts
32069 based solution will be inferior to the final goal, and the feature is
32070 not so compelling it must be supported ahead of the concepts-based
32075 <p><b>Proposed resolution:</b></p>