<html><head><title>Appendix C: ISO C++ 2003 Compatibility, Revision 7</title><style type="text/css">ol{margin:0;padding:0}p{margin:0}.c5{color:#000099;font-size:11pt;font-family:Arial;text-decoration:underline}.c1{line-height:1.15;text-indent:0pt;direction:ltr}.c9{width:468.0pt;background-color:#ffffff;padding:72.0pt 72.0pt 72.0pt 72.0pt}.c8{color:#ff0000;font-size:11pt;font-family:Arial}.c7{color:#000000;font-size:14pt;font-family:Arial}.c6{color:#000000;font-size:24pt;font-family:Arial}.c0{color:#000000;font-size:11pt;font-family:Arial}.c2{color:#000000;font-size:11pt;font-family:Courier New}.c3{height:11pt}.c4{font-weight:bold}body{color:#000000;font-size:11pt;font-family:Arial}h1{color:#000000;font-size:24pt;margin:0;font-family:Arial;font-weight:bold;padding:0}h2{color:#000000;font-size:18pt;margin:0;font-family:Arial;font-weight:bold;padding:0}h3{color:#000000;font-size:14pt;margin:0;font-family:Arial;font-weight:bold;padding:0}h4{color:#000000;font-size:12pt;margin:0;font-family:Arial;font-weight:bold;padding:0}h5{color:#000000;font-size:11pt;margin:0;font-family:Arial;font-weight:bold;padding:0}h6{color:#000000;font-size:10pt;margin:0;font-family:Arial;font-weight:bold;padding:0}</style></head><body class="c9"><p class="c1"><span class="c4 c7">Appendix C: ISO C++ 2003 Compatibility, Revision 7</span></p><p class="c1 c3"><span class="c6 c4"></span></p><p class="c1"><span class="c0">ISO/IEC JTC1 SC22 WG21 N3288=11-0058 &nbsp;2011-03-25</span></p><p class="c1"><span class="c0">Benjamin Kosnik, </span><span class="c5"><a href="mailto:bkoz@redhat.com">bkoz@redhat.com</a></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0 c4">Addresses</span><span class="c7 c4">: </span><span class="c0">UK 6</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c7 c4">Introduction</span></p><p class="c1 c3"><span class="c0 c4"></span></p><p class="c1"><span class="c0">This paper details compatibility of C++ 2003 code, as compiled by this latest version of the C++ standard. It is based on ISO C++ draft N3242, and is a successor to N3186, Appendix C: ISO C++ 2003 Compatibility. This is the seventh revision of the compatibility document.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">Changes for each version are as follows.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">v2:</span></p><p class="c1"><span class="c0">remove 27.5.2 </span></p><p class="c1"><span class="c0">27.5.5.4 basic_ios use of explicit operator bool</span></p><p class="c1"><span class="c0">27.7.2.1.3 basic_istream sentry use of explicit operator bool</span></p><p class="c1"><span class="c0">27.7.3.4 basic_ostream sentry use of explicit operator bool</span></p><p class="c1"><span class="c0">20.6.4 garbage collection</span></p><p class="c1"><span class="c0">20.2.2 swap moved headers</span></p><p class="c1"><span class="c0">17.6.4.3.1 keywords as macros are now verboten</span></p><p class="c1"><span class="c0">15.4 throw() to noexcept and lack of unexpected</span></p><p class="c1"><span class="c0">identifiers</span></p><p class="c1"><span class="c0">23.2 container requirements that were relaxed</span></p><p class="c1"><span class="c0">23.2.3/23.2.4 signature changes reference to value</span></p><p class="c1"><span class="c0">23.2.3/23.2.4 signature changes iterator to const_iterator changes</span></p><p class="c1"><span class="c0">26.4 complex C99 compatibility</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">v3:</span></p><p class="c1"><span class="c0">26.8 cmath new identifiers</span></p><p class="c1"><span class="c0">12.4 clarify destructor throwing vs. new implicit noexcept</span></p><p class="c1"><span class="c0">18.6.1.1 wording improved</span></p><p class="c1"><span class="c0">14.1 wording change</span></p><p class="c1"><span class="c0">added alignas as a keyword, removed static_cast</span></p><p class="c1"><span class="c0">8.5.4 narrowing restrictions in aggregate initialization</span></p><p class="c1"><span class="c0">2.5 raw string note</span></p><p class="c1"><span class="c0">14.6.4.2 overload resolution relaxation allowing static functions</span></p><p class="c1"><span class="c0">5.6 rounding towards zero now explicitly specified</span></p><p class="c1"><span class="c0">2.14.2 long long constants changed from unsigned to signed</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">v4:</span></p><p class="c1"><span class="c0">remove specifying identifiers, point at the index of library names</span></p><p class="c1"><span class="c0">12.1, 12.4, 12.8 implicitly-deleted special member functions</span></p><p class="c1"><span class="c0">21.4.1 string invalidation changes</span></p><p class="c1"><span class="c0">20.8.4/8 function objects no longer derived</span></p><p class="c1"><span class="c0">remove 27.3 sync</span></p><p class="c1"><span class="c0">18.x add operator new vs. bad_alloc </span></p><p class="c1"><span class="c0">23.2 default constructible</span></p><p class="c1"><span class="c0">clarify wording</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">v5:</span></p><p class="c1"><span class="c0">2.5 user-defined literals vs. preprocessing tokens</span></p><p class="c1"><span class="c0">wording changes</span></p><p class="c1"><span class="c0">20.3.3 make_pair</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">v6: </span></p><p class="c1"><span class="c0">wording changes</span></p><p class="c1"><span class="c0">remove make_pair</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">v7: </span></p><p class="c1"><span class="c0">wording changes</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c7 c4">Proposed wording</span></p><p class="c1 c3"><span class="c0 c4"></span></p><p class="c1"><span class="c0">Add a new section to Appendix C with the following contents.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2 C++ and ISO C++2003 [diff.iso.ISO/IEC 14882:2003]</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">The following subclauses list the differences between this International Standard and the previous version of C++ (ISO/IEC 14882:2003 Programming Languages - C++), by the chapters of this document.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.1 Clause 2 lexical conventions</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">2.5</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> New kinds of string literals</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Required for new features.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code may fail to</span></p><p class="c1"><span class="c0">compile or produce different results in this International Standard.</span></p><p class="c1"><span class="c0">Specifically, macros named R, u8, u8R, u, uR, U, UR, or LR will not</span></p><p class="c1"><span class="c0">be expanded when adjacent to a string literal but will be interpreted</span></p><p class="c1"><span class="c0">as part of the string literal. &nbsp;For example,</span></p><p class="c1"><span class="c0"> #define u8 &quot;abc&quot;</span></p><p class="c1"><span class="c0"> const char* s = u8&quot;def&quot;; &nbsp;// Previously &quot;abcdef&quot; now &quot;def&quot;</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">2.5</span></p><p class="c1"><span class="c0 c4">Change: </span><span class="c0">User-defined literal string support</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Required for new features.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid C Standard or ISO/IEC 14882:2003 code may fail to compile in this International Standard, as the following example illustrates.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">#define _x &quot;there&quot;</span></p><p class="c1"><span class="c0">&quot;hello&quot;_x // Line 1</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">Previously, line 1 would have consisted of two separate preprocessing tokens, and the macro _x would have been expanded. In this International Standard, line 1 consists of a single preprocessing token, so the macro is not expanded.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">2.11</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> New Keywords</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Required for new features.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Added to Table 3, the following identifiers are new keywords: alignas, alignof, char16_t, char32_t, constexpr, decltype, &nbsp;noexcept, nullptr, static_assert, and thread_local. Valid ISO/IEC 14882:2003 code using these identifiers is invalid in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">2.14.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Type of integer literals</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> C99 compatibility.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Certain integer literals larger than can be represented by long could change from an unsigned integer type to signed long long. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.2 Clause 5 expressions</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">5.6</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Specify rounding for results of integer / and %</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Increase portability, C99.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code that uses integer division rounds the result toward 0 or toward negative infinity, whereas this International Standard always rounds the result toward 0. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.3 Clause 7 declarations</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">7.1.1</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Remove auto as a storage class specifier</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> New feature.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code that uses the keyword auto as a storage class specifier may be invalid in this International Standard. In this International Standard, auto now indicates that the type of a variable is to be deduced from its initializer expression.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.4 Clause 8 declarators</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">8.5.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Narrowing restrictions in aggregate initializers</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Catches bugs.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code may fail to compile in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">For example:</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">The following code is valid in ISO/IEC 14882:2003 but invalid in this International Standard (because double to int is a narrowing conversion):</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;int x[] = { 2.0 };</span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.5 Clause 12 special member functions</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">12.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> User declared destructors have an implicit exception specification.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Clarification of destructor requirements.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code may execute differently in this International Standard. In particular, destructors that throw will call terminate (without calling unexpected) if their exception specification is noexcept or noexcept(true). For a throwing virtual destructor of a derived class, terminate can be avoided only if the base-class virtual destructor has an exception specification that is not noexcept or noexcept(true).</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">12.1, 12.4, 12.8</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Implicitly-declared special member functions are defined as</span></p><p class="c1"><span class="c0">deleted when the implicit definition would have been ill-formed</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Improves template argument deduction failure</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> A valid ISO/IEC 14882:2003 program that uses one of these special member functions in a context where the definition is not</span></p><p class="c1"><span class="c0">required (e.g., in an expression that is not potentially evaluated)</span></p><p class="c1"><span class="c0">becomes ill-formed.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.6 Clause 14 templates</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">14.1</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Remove export.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> No implementation consensus.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> A valid ISO/IEC 14882:2003 declaration containing export is ill-formed in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">14.3</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Remove whitespace requirement for nested closing template right angle brackets</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Considered a persistent, but minor, annoyance. Template aliases representing nonclass types would exacerbate whitespace issues.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Change to semantics of well-defined expression. A valid ISO/IEC 14882:2003 expression containing a right angle bracket (&#39;&gt;&#39;) followed immediately by another right angle bracket may now be treated as closing two templates.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">For example:</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">The following code is valid in ISO/IEC 14882:2003 (because &quot;</span><span class="c2">&gt;&gt;</span><span class="c0">&quot; is a right-shift operator) but invalid in this International Standard (because the &quot;</span><span class="c2">&gt;&gt;</span><span class="c0">&quot; closes two templates):</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;template&lt;typename T&gt; struct X { };</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;template&lt;int N&gt; struct Y { };</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;X&lt; Y&lt; 1 &gt;&gt; 2 &gt; &gt; x;</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">14.6.4.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Allow dependent calls of functions with internal linkage.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Overly constrained, simplify overload resolution rules.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> A valid ISO/IEC 14882:2003 program could get a different result than this International Standard.</span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1"><span class="c0">C.2.7 Clause 17 library introduction</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">17.6.1.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> New includes.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> New functionality.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> The following C++ include files are new: array, atomic, chrono, codecvt, condition_variable, forward_list, future, initializer_list, mutex, random, ratio, regex, scoped_allocator, sytem_error, thread, tuple, typeindex, type_traits, unordered_map, and unordered_set. In addition, the following C compatibility include files are new: ccomplex, cfenv, cinttypes, cstdalign, cstdbool, cstdint, ctgmath, and cuchar. Valid ISO/IEC 14882:2003 code that includes files with these names may be invalid in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">17.6.3.2.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> New reserved namespace.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> New functionality.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> The global namespace posix is now reserved for standardization. Valid ISO/IEC 14882:2003 code that used a top-level posix namespace may be invalid in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">17.6.4.3.1</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> More restrictions on macro names.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Avoid hard to diagnose or non-portable constructs.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Attribute identifiers are not allowed to be macros. Valid ISO/IEC 14882:2003 code that defines override, final, carries_dependency, and noreturn as macros is invalid in this International Standard. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">17-30</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> New reserved identifiers.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Required by new features.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">Valid ISO/IEC 14882:2003 code that uses any identifiers used by newly-standardized this International Standard features will fail to compile. A comprehensive list of new identifiers is not provided: instead, consult the index of library names.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.8 Clause 18 library support</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">18.6.1.1</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Linking new/delete operators.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> The two throwing single-object signatures of operator new and delete are now specified to form the base functionality for the other operators. This clarifies that replacing just these two signatures changes others, even if they are not explicitly changed. </span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code that replaces global new/delete operators may execute differently in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">For example:</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;#include &lt;cstdio&gt;</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;#include &lt;cstdlib&gt;</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;#include &lt;new&gt;</span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;void* operator new(std::size_t size) throw(std::bad_alloc)</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;{</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp; &nbsp; &nbsp;&hellip;</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;}</span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;void &nbsp;operator delete(void* ptr) throw()</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;{</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp; &nbsp; std::printf(&quot;custom deallocation\n&quot;);</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp; &nbsp; std::free(ptr);</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;}</span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;int main()</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;{</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp; &nbsp; int* i = new int;</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp; &nbsp; delete i;</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp; &nbsp; int* a = new int[3]; // Use array version</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp; &nbsp; delete [] a;</span></p><p class="c1"><span class="c2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; return 0;</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;}</span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1"><span class="c0">18.6.1.1</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Operator new may throw exceptions besides bad_alloc.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Consistent application of noexcept. </span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code that assumes global operator new only throws bad_alloc may execute differently in this International Standard.</span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1 c3"><span class="c2"></span></p><p class="c1"><span class="c0">C.2.9 Clause 19 diagnostics</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">19.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Thread-local error numbers.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Support new thread facilities.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">Valid but implementation-defined ISO/IEC 14882:2003 code that relies on errno being the same across threads may change behavior in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.10 Clause 20 utilities</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">20.2.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Function swap changes headers.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Remove dependency on &lt;algorithm&gt; for swap.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">Valid ISO/IEC 14882:2003 code that has been compiled expecting swap to be in &lt;algorithm&gt; may have to instead include &lt;utility&gt;.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">20.6.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Minimal support for garbage-collected regions.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Required by new feature.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">Valid ISO/IEC 14882:2003 code that has been compiled without traceable pointer support and then inter-operates with newer C++ code using regions declared reachable may experience different or undefined runtime behavior. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">20.8.4</span></p><p class="c1"><span class="c0">20.8.5</span></p><p class="c1"><span class="c0">20.8.6</span></p><p class="c1"><span class="c0">20.8.7</span></p><p class="c1"><span class="c0">20.8.8</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Standard function objects no longer derived.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Superseded by new feature.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">Valid ISO/IEC 14882:2003 code that depends on function objects being derived from unary_function or binary_function will execute differently in this International Standard.</span></p><p class="c1 c3"><span class="c8"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.11 Clause 21 strings</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">21.3 </span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Change basic_string requirements to disallow reference counted strings.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Invalidation is subtly different between reference-counted strings and other implementation strategies. Regularize behavior for new this International Standard features.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> ISO/IEC 14882:2003 code may execute differently in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">21.4.1</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Loosen basic_string invalidation requirements.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Allow implementations to use a small-string optimization</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> ISO/IEC 14882:2003 code may execute differently in this International Standard. Some const member functions, like data and c_str, no longer invalidate iterators.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.12 Clause 23 containers</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">23.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Requirements change: specify size() complexity to be constant.</span></p><p class="c1"><span class="c0 c4">Rationale: </span><span class="c0">Lack of size() specification results in divergent implementations with inconsistent performance characteristics.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Some container implementations in ISO/IEC 14882:2003 may not conform to the specified size() requirements in this International Standard. Adjusting containers (such as list) to the stricter requirements may require incompatible changes.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">23.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Requirements change: relaxation.</span></p><p class="c1"><span class="c0 c4">Rationale: </span><span class="c0">Clarification of container requirements. </span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code that attempted to meet the specified container requirements may now be over-specified. Code that attempted to be portable across containers may need to be adjusted as follows:</span></p><p class="c1"><span class="c0">a) not all containers provide size() so use empty() instead of size()==0</span></p><p class="c1"><span class="c0">b) not all containers are empty after construction (array)</span></p><p class="c1"><span class="c0">c) not all containers have constant complexity with swap() (array)</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">23.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Requirements change: default constructible.</span></p><p class="c1"><span class="c0 c4">Rationale: </span><span class="c0">Clarification of container requirements. </span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Valid ISO/IEC 14882:2003 code that attempted to explicitly instantiate a container using a user-defined type with no default constructor may fail to compile. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">23.2.3</span></p><p class="c1"><span class="c0">23.2.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Signature changes: from void return types.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Throwing away useful information that may be expensive to re-calculate.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">The following member functions changed:</span></p><p class="c1"><span class="c0">a) erase(iter) for set, multiset, map, multimap</span></p><p class="c1"><span class="c0">b) erase(begin,end) for set, multiset, map, multimap</span></p><p class="c1"><span class="c0">c) insert(pos,num,val) for vector, deque, list, forward_list</span></p><p class="c1"><span class="c0">d) insert(pos,beg,end) for vector, deque, list, forward_list</span></p><p class="c1"><span class="c0">Valid ISO/IEC 14882:2003 code that may not be inter-operable with this International Standard if return types change from void. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">23.2.3</span></p><p class="c1"><span class="c0">23.2.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Signature changes: from iterator to const_iterator parameters.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Overspecification.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">The following member functions changed from iterator to const_iterator:</span></p><p class="c1"><span class="c0">a) insert(iter,val) for vector, deque, list, set, multiset, map, multimap</span></p><p class="c1"><span class="c0">b) insert(pos,beg,end) for vector, deque, list, forward_list</span></p><p class="c1"><span class="c0">c) erase(iter) for set, multiset, map, multimap</span></p><p class="c1"><span class="c0">d) erase(begin,end) for set, multiset, map, multimap</span></p><p class="c1"><span class="c0">e) all forms of list::splice</span></p><p class="c1"><span class="c0">f) all forms of list::merge</span></p><p class="c1"><span class="c0">Valid ISO/IEC 14882:2003 code that may not be inter-operable with this International Standard if member function parameters change. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">23.2.3</span></p><p class="c1"><span class="c0">23.2.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Signature changes: resize.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Performance, compatibility with move semantics.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">The resize member function changed from value to reference, and an additional overload was added. This impacts vector, deque, and list. Valid ISO/IEC 14882:2003 code may not be inter-operable with this International Standard if member function parameters change. </span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.13 Clause 25 algorithms</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">25.1</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Result state of inputs after algorithm use.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Required by new features.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">A ISO/IEC 14882:2003 program may notice that an object with a valid but unspecified state has a different valid but unspecified state. Specific algorithms of note are remove and remove_if, but may not be limited to just these two examples.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.14 Clause 26 numerics</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">26.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Specify complex representation.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Compatibility with C99.</span></p><p class="c1"><span class="c0 c4">Effect on original feature: </span><span class="c0">Valid ISO/IEC 14882:2003 code that uses implementation-specific knowledge about the binary representation of the required template specializations of complex may not be compatible with this International Standard, which mandates storage-compatibility with C99.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">C.2.15 Clause 27 io</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">27.7.2.1.3</span></p><p class="c1"><span class="c0">27.7.3.4</span></p><p class="c1"><span class="c0">27.5.5.4</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Specify use of explicit in existing boolean conversion operators</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Clarify intentions, avoid workarounds.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Use &#39;explicit operator bool()&#39; rather than unspecified bool type or void* for conversions in basic_ios, basic_istream, and basic_ostream sentries. &nbsp;The lack of implicit conversion-to-bool will break code relying on it in the following conditions:</span></p><p class="c1"><span class="c0">a) Passing into a &#39;bool&#39; argument for a function</span></p><p class="c1"><span class="c0">b) Invoking operator== </span></p><p class="c1"><span class="c0">c) In a return statement for a function returning bool</span></p><p class="c1"><span class="c0">d) Initializing &#39;bool&#39; members in an aggregate via aggregate initialization</span></p><p class="c1"><span class="c0">e) Initializing a &#39;const bool &amp;&#39; which would bind to the temporary</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">27.4.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Change base class of ios_base::failure.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> Detailed error messages.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Define ios_base::failure base class as system_error. ISO/IEC 14882:2003 code may execute differently in this International Standard.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">27.5.2</span></p><p class="c1"><span class="c0 c4">Change:</span><span class="c0"> Change ios_base:: types from enumerations to formalized bitmasks represented as constexpr member data.</span></p><p class="c1"><span class="c0 c4">Rationale:</span><span class="c0"> All bitmask types should be defined as enumerations with mask operators implemented as constexpr functions.</span></p><p class="c1"><span class="c0 c4">Effect on original feature:</span><span class="c0"> Define ios_base::fmtflags, ios_base::iostate, ios_base::openmode, ios_base::seekdir as formalized bitmask types.</span></p><p class="c1"><span class="c0">Some code that depended on the implementation properties of these types being std::bitset or a builtin integer type may no longer compile.</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0">For example:</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c0"> </span><span class="c2"> &nbsp; #include &lt;iostream&gt;</span></p><p class="c1"><span class="c2"> &nbsp; &nbsp;std::cout.setf(17); // should be std::cout.setf(hex);</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c7 c4">References</span></p><p class="c1 c3"><span class="c0 c4"></span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2007%2Fn2270.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH_hFH7tNDIRHlm2jb3QjrU6dPbqA">N2270</a></span><span class="c0"> Incompatible Changes in this International Standard</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2733.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFfiNoNepIdN2nVYKmXTiSkeRajuQ">N2733</a></span><span class="c0"> Appendix C: ISO C++ 2003 Compatibility</span></p><p class="c1"><span class="c0">N3126 Draft Programing Languages - C++, Pete Becker</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwiki.dinkumware.com%2Ftwiki%2Fpub%2FWg21batavia%2FFormalMotions%2Fn3204.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNHuZmLXyO22AhscbA8It3kGP-PkHQ">N3204</a></span><span class="c0"> Deducing &#39;noexcept&#39; for destructors</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwiki.dinkumware.com%2Ftwiki%2Fpub%2FWg21batavia%2FFormalMotions%2Fn3205.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNGs6Jo_uWTAGRx3KUAU7NscH_hOOw">N3205</a></span><span class="c0"> Delete operators default to noexcept</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2010%2Fn3110.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFqyeVt0NATsUWmmefYq4KHObnj2w">N3110</a></span><span class="c0"> Problems with bitmask types in the library</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBUQFjAA&amp;url=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2010%2Fn3064.pdf&amp;rct=j&amp;q=N3064&amp;ei=-1PwTPfPL5CCsQPR1pi3Cw&amp;usg=AFQjCNG7cXt0b5lxGO8N1wuqRpbD3kyPTA&amp;sig2=2LO5EAOWUikiwbTVzQyy0A&amp;cad=rja">N3064</a></span><span class="c0"> Core issue 374: Explicit specialization outside a template&#39;s parent (revision 1)</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwiki.dinkumware.com%2Ftwiki%2Fpub%2FWg21pittsburgh%2FFormalMotions%2Fn3065.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNHEXXo3X9rqtfEjIIcr4hbLx8FQzQ">N3065</a></span><span class="c0"> Removing Export</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBMQFjAA&amp;url=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2010%2Fn3068.pdf&amp;rct=j&amp;q=N3068&amp;ei=OVTwTPjgKJKWsgPdwMy3Cw&amp;usg=AFQjCNF_BubBnAv8-HcKncAqOpX750yUfA&amp;sig2=m8fmtXXQAYemZ25_Gq1xDw&amp;cad=rja">N3068</a></span><span class="c0"> Equality Comparison for Unordered Containers (Rev 2)</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBMQFjAA&amp;url=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2009%2Fn2923.pdf&amp;rct=j&amp;q=N2923%20wg21&amp;ei=ZlTwTILyDJP0swO6uoDlCw&amp;usg=AFQjCNGXqOnYef0V6Q3srQRd6Nj7w8vIJg&amp;sig2=-TfcFKVcDk_rXBubNUUezg&amp;cad=rja">N2923</a></span><span class="c0"> Specifying the complexity of size() (Revision 1)</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2760.htm&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNGZqWainiKr5fAczSltSg8_OGuLWA">N2760</a></span><span class="c0"> Input/Output Library Thread Safety</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2FJTC1%2FSC22%2FWG21%2Fdocs%2Fpapers%2F2008%2Fn2769.htm&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNHx-5mt-w37O-rvfbObN8Zc7tHpIQ">N2769</a></span><span class="c0"> Detailed Reporting for Input/Output Library Errors (Revision 2)</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2668.htm&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNF5-vMlCIRCvdadX3W60ws2ec5aHg">N2668</a></span><span class="c0"> Concurrency Modifications to Basic String </span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBMQFjAA&amp;url=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2680.pdf&amp;rct=j&amp;q=N2680%20wg21&amp;ei=dhzwTIHCDJKqsAPDq7HOCw&amp;usg=AFQjCNH_onxDO3w4fxZ6x0cdjei6dJHS2Q&amp;sig2=IPHp5YbiDchLHHmCEVynsA&amp;cad=rja">N2680</a></span><span class="c0"> Proposed Wording for Placement Insert (Revision 1)</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2586.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNE4KJRdfU0SnGlpUEQUFJlR09bEQg">N2586</a></span><span class="c0"> N2586: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised)</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2002%2Fn1388.pdf&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNE2MJN_ZYVZz050TfRL3Mjo6bjAgQ">N1388</a></span><span class="c0"> Enhancing Numerical Support</span></p><p class="c1"><span class="c5"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2005%2Fn1811.pdf&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNGFBbKsPHjdTOiWjYbG-oijL6HJ7Q">N1811</a></span><span class="c0"> Adding the long long type to C++ (Revision 3)</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1"><span class="c7 c4">Acknowledgements</span></p><p class="c1"><span class="c0">LWG meeting attendents, Alisdair Meredith, Daniel Kr&uuml;gler, Nicolai M. Josuttis, Jason Merrill, John Spicer, Doug Gregor, Jan Stephen Adamczyk, Ville Voutilainen, William Michael Miller</span></p><p class="c1 c3"><span class="c0"></span></p><p class="c1 c3"><span class="c0 c4"></span></p><p class="c1 c3"><span class="c0"></span></p></body></html>