Files
2025-10-25 03:02:53 +03:00

1017 lines
34 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[diff.cpp03]
# Annex C (informative) Compatibility [[diff]](./#diff)
## C.6 C++ and ISO C++ 2003 [diff.cpp03]
### [C.6.1](#general) General [[diff.cpp03.general]](diff.cpp03.general)
[1](#general-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2121)
Subclause [diff.cpp03] lists the differences between C++ and
ISO C++ 2003,
in addition to those listed above,
by the chapters of this document[.](#general-1.sentence-1)
### [C.6.2](#lex) [[lex]](lex "5Lexical conventions"): lexical conventions [[diff.cpp03.lex]](diff.cpp03.lex)
[1](#lex-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2130)
**Affected subclause:** [[lex.pptoken]](lex.pptoken)
**Change:** New kinds of [*string-literal*](lex.string#nt:string-literal "5.13.5String literals[lex.string]")*s*[.](#lex-1.sentence-1)
**Rationale:** Required for new features[.](#lex-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may fail to compile or produce different results in
this revision of C++[.](#lex-1.sentence-3)
Specifically, macros named R, u8,u8R, u, uR, U, UR, or LR will
not be expanded when adjacent to a [*string-literal*](lex.string#nt:string-literal "5.13.5String literals[lex.string]") but will be interpreted as
part of the [*string-literal*](lex.string#nt:string-literal "5.13.5String literals[lex.string]")[.](#lex-1.sentence-4)
[*Example [1](#lex-example-1)*: #define u8 "abc"const char* s = u8"def"; // Previously "abcdef", now "def" — *end example*]
[2](#lex-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2148)
**Affected subclause:** [[lex.pptoken]](lex.pptoken)
**Change:** User-defined literal string support[.](#lex-2.sentence-1)
**Rationale:** Required for new features[.](#lex-2.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may fail to compile or produce different results in
this revision of C++[.](#lex-2.sentence-3)
[*Example [2](#lex-example-2)*: #define _x "there""hello"_x // #1
Previously, #1 would have consisted of two separate preprocessing tokens and
the macro _x would have been expanded[.](#lex-2.sentence-4)
In this revision of C++,
#1 consists of a single preprocessing token, so the macro is not expanded[.](#lex-2.sentence-5)
— *end example*]
[3](#lex-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2167)
**Affected subclause:** [[lex.key]](lex.key)
**Change:** New keywords[.](#lex-3.sentence-1)
**Rationale:** Required for new features[.](#lex-3.sentence-2)
**Effect on original feature:** Added to Table [5](lex.key#tab:lex.key "Table 5: Keywords"), the following identifiers are new keywords:alignas,alignof,char16_t,char32_t,constexpr,decltype,noexcept,nullptr,static_assert,
andthread_local[.](#lex-3.sentence-3)
Valid C++ 2003 code using these identifiers is invalid in this revision of C++[.](#lex-3.sentence-4)
[4](#lex-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2187)
**Affected subclause:** [[lex.icon]](lex.icon)
**Change:** Type of integer literals[.](#lex-4.sentence-1)
**Rationale:** C99 compatibility[.](#lex-4.sentence-2)
**Effect on original feature:** Certain integer literals larger than can be represented by long could
change from an unsigned integer type to signed long long[.](#lex-4.sentence-3)
### [C.6.3](#expr) [[expr]](expr "7Expressions"): expressions [[diff.cpp03.expr]](diff.cpp03.expr)
[1](#expr-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2198)
**Affected subclause:** [[conv.ptr]](conv.ptr)
**Change:** Only literals are integer null pointer constants[.](#expr-1.sentence-1)
**Rationale:** Removing surprising interactions with templates and constant
expressions[.](#expr-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may fail to compile or produce different results in
this revision of C++[.](#expr-1.sentence-3)
[*Example [1](#expr-example-1)*: void f(void *); // #1void f(...); // #2template<int N> void g() { f(0*N); // calls #2; used to call #1} — *end example*]
[2](#expr-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2217)
**Affected subclause:** [[expr.typeid]](expr.typeid)
**Change:** Evaluation of operands in typeid[.](#expr-2.sentence-1)
**Rationale:** Introduce additional expression value categories[.](#expr-2.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that uses xvalues as operands for typeid may change behavior in this revision of C++[.](#expr-2.sentence-3)
[*Example [2](#expr-example-2)*: void f() {struct B { B() {}virtual ~B() { }}; struct C { B b; }; typeid(C().b); // unevaluated in C++ 2003, evaluated in C++ 2011} — *end example*]
[3](#expr-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2239)
**Affected subclause:** [[expr.mul]](expr.mul)
**Change:** Specify rounding for results of integer / and %[.](#expr-3.sentence-1)
**Rationale:** Increase portability, C99 compatibility[.](#expr-3.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that uses integer division rounds the result toward 0 or
toward negative infinity, whereas this revision of C++ always rounds
the result toward 0[.](#expr-3.sentence-3)
[4](#expr-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2249)
**Affected subclause:** [[expr.log.and]](expr.log.and)
**Change:** && is valid in a [*type-name*](dcl.type.simple#nt:type-name "9.2.9.3Simple type specifiers[dcl.type.simple]")[.](#expr-4.sentence-1)
**Rationale:** Required for new features[.](#expr-4.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may fail to compile or produce different results in
this revision of C++[.](#expr-4.sentence-3)
[*Example [3](#expr-example-3)*: bool b1 = new int && false; // previously false, now ill-formedstruct S { operator int(); };bool b2 = &S::operator int && false; // previously false, now ill-formed — *end example*]
[5](#expr-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2265)
**Affected subclause:** [[expr.cond]](expr.cond)
**Change:** Fewer copies in the conditional operator[.](#expr-5.sentence-1)
**Rationale:** Introduce additional expression value categories[.](#expr-5.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that uses xvalues as operands for the conditional operator
may change behavior in this revision of C++[.](#expr-5.sentence-3)
[*Example [4](#expr-example-4)*: void f() {struct B { B() {} B(const B&) { }}; struct D : B {}; struct BB { B b; }; struct DD { D d; }; true ? BB().b : DD().d; // additional copy in C++ 2003, no copy or move in C++ 2011} — *end example*]
### [C.6.4](#dcl.dcl) [[dcl]](dcl "9Declarations"): declarations [[diff.cpp03.dcl.dcl]](diff.cpp03.dcl.dcl)
[1](#dcl.dcl-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2292)
**Affected subclause:** [[dcl.spec]](dcl.spec)
**Change:** Remove auto as a storage class specifier[.](#dcl.dcl-1.sentence-1)
**Rationale:** New feature[.](#dcl.dcl-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that uses the keyword auto as a storage class
specifier
may be invalid in this revision of C++[.](#dcl.dcl-1.sentence-3)
In this revision of C++,auto indicates that the type of a variable is to be deduced
from its initializer expression[.](#dcl.dcl-1.sentence-4)
[2](#dcl.dcl-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2305)
**Affected subclause:** [[dcl.init.list]](dcl.init.list)
**Change:** Narrowing restrictions in aggregate initializers[.](#dcl.dcl-2.sentence-1)
**Rationale:** Catches bugs[.](#dcl.dcl-2.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may fail to compile in this revision of C++[.](#dcl.dcl-2.sentence-3)
[*Example [1](#dcl.dcl-example-1)*: int x[] = { 2.0 };
This code is valid in C++ 2003 but invalid in this
revision of C++ because double to int is a narrowing
conversion[.](#dcl.dcl-2.sentence-4)
— *end example*]
[3](#dcl.dcl-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2321)
**Affected subclause:** [[dcl.link]](dcl.link)
**Change:** Names declared in an anonymous namespace
changed from external linkage to internal linkage;
language linkage applies to names with external linkage only[.](#dcl.dcl-3.sentence-1)
**Rationale:** Alignment with user expectations[.](#dcl.dcl-3.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may violate the one-definition rule ([[basic.def.odr]](basic.def.odr "6.3One-definition rule"))
in this revision of C++[.](#dcl.dcl-3.sentence-3)
[*Example [2](#dcl.dcl-example-2)*: namespace { extern "C" { extern int x; } } // #1, previously external linkage and C language linkage,// now internal linkage and C++ language linkagenamespace A { extern "C" int x = 42; } // #2, external linkage and C language linkageint main(void) { return x; }
This code is valid in C++ 2003,
but #2 is not a definition for #1 in this revision of C++, violating the one-definition rule[.](#dcl.dcl-3.sentence-4)
— *end example*]
### [C.6.5](#class) [[class]](class "11Classes"): classes [[diff.cpp03.class]](diff.cpp03.class)
[1](#class-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2345)
**Affected subclauses:** [[class.default.ctor]](class.default.ctor), [[class.dtor]](class.dtor), [[class.copy.ctor]](class.copy.ctor), and [[class.copy.assign]](class.copy.assign)
**Change:** Implicitly-declared special member functions are defined as deleted
when the implicit definition would have been ill-formed[.](#class-1.sentence-1)
**Rationale:** Improves template argument deduction failure[.](#class-1.sentence-2)
**Effect on original feature:** A valid C++ 2003 program that uses one of these special member functions in a
context where the definition is not required (e.g., in an expression that is
not potentially evaluated) becomes ill-formed[.](#class-1.sentence-3)
[2](#class-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2356)
**Affected subclause:** [[class.dtor]](class.dtor)
**Change:** User-declared destructors have an implicit exception specification[.](#class-2.sentence-1)
**Rationale:** Clarification of destructor requirements[.](#class-2.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may execute differently in this revision of C++[.](#class-2.sentence-3)
In
particular, destructors that throw exceptions will call std::terminate (without calling std::unexpected) if their exception specification is
non-throwing[.](#class-2.sentence-4)
### [C.6.6](#temp) [[temp]](temp "13Templates"): templates [[diff.cpp03.temp]](diff.cpp03.temp)
[1](#temp-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2369)
**Affected subclause:** [[temp.param]](temp.param)
**Change:** Repurpose export for modules ([[module]](module "10Modules"), [[cpp.module]](cpp.module "15.5Module directive"), [[cpp.import]](cpp.import "15.6Header unit importation"))[.](#temp-1.sentence-1)
**Rationale:** No implementation consensus for the C++ 2003 meaning of export[.](#temp-1.sentence-2)
**Effect on original feature:** A valid C++ 2003 program containing export is ill-formed in this
revision of C++[.](#temp-1.sentence-3)
[2](#temp-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2378)
**Affected subclause:** [[temp.arg]](temp.arg)
**Change:** Remove whitespace requirement for nested closing template right angle
brackets[.](#temp-2.sentence-1)
**Rationale:** Considered a persistent but minor annoyance[.](#temp-2.sentence-2)
Template aliases
representing non-class types would exacerbate whitespace issues[.](#temp-2.sentence-3)
**Effect on original feature:** Change to semantics of well-defined expression[.](#temp-2.sentence-4)
A valid C++ 2003 expression
containing a right angle bracket (“>”) followed immediately by
another right angle bracket may now be treated as closing two templates[.](#temp-2.sentence-5)
[*Example [1](#temp-example-1)*: template <class T> struct X { };template <int N> struct Y { };
X< Y< 1 >> 2 > > x;
This code is valid in C++ 2003 because “>>”
is a right-shift operator, but invalid in this revision of C++ because
“>>” closes two templates[.](#temp-2.sentence-6)
— *end example*]
[3](#temp-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2400)
**Affected subclause:** [[temp.dep.candidate]](temp.dep.candidate)
**Change:** Allow dependent calls of functions with internal linkage[.](#temp-3.sentence-1)
**Rationale:** Overly constrained, simplify overload resolution rules[.](#temp-3.sentence-2)
**Effect on original feature:** A valid C++ 2003 program can get a different result in this
revision of C++[.](#temp-3.sentence-3)
### [C.6.7](#library) [[library]](library "16Library introduction"): library introduction [[diff.cpp03.library]](diff.cpp03.library)
[1](#library-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2411)
**Affected:** [[library]](library "16Library introduction") – [[exec]](exec "33Execution control library")
**Change:** New reserved identifiers[.](#library-1.sentence-2)
**Rationale:** Required by new features[.](#library-1.sentence-3)
**Effect on original feature:** Valid C++ 2003 code that uses any identifiers added to the C++ standard
library by later revisions of C++ may fail to compile or produce different
results in this revision of C++[.](#library-1.sentence-4)
A comprehensive list of identifiers used
by the C++ standard library can be found in the Index of Library Names in this
document[.](#library-1.sentence-5)
[2](#library-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2424)
**Affected subclause:** [[headers]](headers)
**Change:** New headers[.](#library-2.sentence-1)
**Rationale:** New functionality[.](#library-2.sentence-2)
**Effect on original feature:** The following C++ headers are new:[<array>](array.syn#header:%3carray%3e "23.3.2Header <array> synopsis[array.syn]"),[<atomic>](atomics.syn#header:%3catomic%3e "32.5.2Header <atomic> synopsis[atomics.syn]"),[<chrono>](time.syn#header:%3cchrono%3e "30.2Header <chrono> synopsis[time.syn]"),[<condition_variable>](condition.variable.syn#header:%3ccondition_variable%3e "32.7.2Header <condition_­variable> synopsis[condition.variable.syn]"),[<forward_list>](forward.list.syn#header:%3cforward_list%3e "23.3.6Header <forward_­list> synopsis[forward.list.syn]"),[<future>](future.syn#header:%3cfuture%3e "32.10.2Header <future> synopsis[future.syn]"),<initializer_list> ([[initializer.list.syn]](initializer.list.syn "17.11.2Header <initializer_­list> synopsis")),[<mutex>](mutex.syn#header:%3cmutex%3e "32.6.2Header <mutex> synopsis[mutex.syn]"),[<random>](rand.synopsis#header:%3crandom%3e "29.5.2Header <random> synopsis[rand.synopsis]"),[<ratio>](ratio.syn#header:%3cratio%3e "21.5.2Header <ratio> synopsis[ratio.syn]"),[<regex>](re.syn#header:%3cregex%3e "28.6.3Header <regex> synopsis[re.syn]"),[<scoped_allocator>](allocator.adaptor.syn#header:%3cscoped_allocator%3e "20.6.1Header <scoped_­allocator> synopsis[allocator.adaptor.syn]"),[<system_error>](system.error.syn#header:%3csystem_error%3e "19.5.2Header <system_­error> synopsis[system.error.syn]"),[<thread>](thread.syn#header:%3cthread%3e "32.4.2Header <thread> synopsis[thread.syn]"),[<tuple>](tuple.syn#header:%3ctuple%3e "22.4.2Header <tuple> synopsis[tuple.syn]"),<typeindex> ([[type.index.synopsis]](type.index.synopsis "17.7.6Header <typeindex> synopsis")),[<type_traits>](meta.type.synop#header:%3ctype_traits%3e "21.3.3Header <type_­traits> synopsis[meta.type.synop]"),[<unordered_map>](unord.map.syn#header:%3cunordered_map%3e "23.5.2Header <unordered_­map> synopsis[unord.map.syn]"),
and[<unordered_set>](unord.set.syn#header:%3cunordered_set%3e "23.5.5Header <unordered_­set> synopsis[unord.set.syn]")[.](#library-2.sentence-3)
In addition the following C compatibility headers are new:[<cfenv>](cfenv.syn#header:%3ccfenv%3e "29.3.1Header <cfenv> synopsis[cfenv.syn]"),[<cinttypes>](cinttypes.syn#header:%3ccinttypes%3e "31.13.2Header <cinttypes> synopsis[cinttypes.syn]"),[<cstdint>](cstdint.syn#header:%3ccstdint%3e "17.4.1Header <cstdint> synopsis[cstdint.syn]"),
and[<cuchar>](cuchar.syn#header:%3ccuchar%3e "28.7.4Header <cuchar> synopsis[cuchar.syn]")[.](#library-2.sentence-4)
Valid C++ 2003 code that #includes headers with these names may be
invalid in this revision of C++[.](#library-2.sentence-5)
[3](#library-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2460)
**Affected subclause:** [[swappable.requirements]](swappable.requirements)
**Change:** Function swap moved to a different header[.](#library-3.sentence-1)
**Rationale:** Remove dependency on [<algorithm>](algorithm.syn#header:%3calgorithm%3e "26.4Header <algorithm> synopsis[algorithm.syn]") for swap[.](#library-3.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that has been compiled expecting swap to be in[<algorithm>](algorithm.syn#header:%3calgorithm%3e "26.4Header <algorithm> synopsis[algorithm.syn]") may have to instead include [<utility>](utility.syn#header:%3cutility%3e "22.2.1Header <utility> synopsis[utility.syn]")[.](#library-3.sentence-3)
[4](#library-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2469)
**Affected subclause:** [[namespace.posix]](namespace.posix)
**Change:** New reserved namespace[.](#library-4.sentence-1)
**Rationale:** New functionality[.](#library-4.sentence-2)
**Effect on original feature:** The global namespace posix is now reserved for standardization[.](#library-4.sentence-3)
Valid
C++ 2003 code that uses a top-level namespace posix may be invalid in
this revision of C++[.](#library-4.sentence-4)
[5](#library-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2479)
**Affected subclause:** [[macro.names]](macro.names)
**Change:** Additional restrictions on macro names[.](#library-5.sentence-1)
**Rationale:** Avoid hard to diagnose or non-portable constructs[.](#library-5.sentence-2)
**Effect on original feature:** Names of attribute identifiers may not be used as macro names[.](#library-5.sentence-3)
Valid C++ 2003
code that defines override, final, ornoreturn as macros is invalid in this
revision of C++[.](#library-5.sentence-4)
### [C.6.8](#language.support) [[support]](support "17Language support library"):
language support library [[diff.cpp03.language.support]](diff.cpp03.language.support)
[1](#language.support-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2493)
**Affected subclause:** [[new.delete.single]](new.delete.single)
**Change:** operator new may throw exceptions other thanstd::bad_alloc[.](#language.support-1.sentence-1)
**Rationale:** Consistent application of noexcept[.](#language.support-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that assumes that global operator new only
throws std::bad_alloc may execute differently in this revision of C++[.](#language.support-1.sentence-3)
Valid C++ 2003 code that replaces the global replaceable operator new is ill-formed in this revision of C++,
because the exception specification of throw(std::bad_alloc) was removed[.](#language.support-1.sentence-4)
### [C.6.9](#diagnostics) [[diagnostics]](diagnostics "19Diagnostics library"): diagnostics library [[diff.cpp03.diagnostics]](diff.cpp03.diagnostics)
[1](#diagnostics-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2509)
**Affected subclause:** [[errno]](errno)
**Change:** Thread-local error numbers[.](#diagnostics-1.sentence-1)
**Rationale:** Support for new thread facilities[.](#diagnostics-1.sentence-2)
**Effect on original feature:** Valid but implementation-specific C++ 2003 code that relies onerrno being the same across threads may change behavior in this
revision of C++[.](#diagnostics-1.sentence-3)
### [C.6.10](#utilities) [[utilities]](utilities "22General utilities library"): general utilities library [[diff.cpp03.utilities]](diff.cpp03.utilities)
[1](#utilities-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2521)
**Affected subclauses:** [[refwrap]](refwrap), [[arithmetic.operations]](arithmetic.operations), [[comparisons]](comparisons), [[logical.operations]](logical.operations), and [[bitwise.operations]](bitwise.operations)
**Change:** Standard function object types no longer derived fromstd::unary_function or std::binary_function[.](#utilities-1.sentence-1)
**Rationale:** Superseded by new feature; unary_function andbinary_function are no longer defined[.](#utilities-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that depends on function object types being derived fromunary_function or binary_function may fail to compile
in this revision of C++[.](#utilities-1.sentence-3)
### [C.6.11](#strings) [[strings]](strings "27Strings library"): strings library [[diff.cpp03.strings]](diff.cpp03.strings)
[1](#strings-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2535)
**Affected subclause:** [[string.classes]](string.classes)
**Change:** basic_string requirements no longer allow reference-counted
strings[.](#strings-1.sentence-1)
**Rationale:** Invalidation is subtly different with reference-counted strings[.](#strings-1.sentence-2)
This change regularizes behavior[.](#strings-1.sentence-3)
**Effect on original feature:** Valid C++ 2003 code may execute differently in this revision of C++[.](#strings-1.sentence-4)
[2](#strings-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2545)
**Affected subclause:** [[string.require]](string.require)
**Change:** Loosen basic_string invalidation rules[.](#strings-2.sentence-1)
**Rationale:** Allow small-string optimization[.](#strings-2.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may execute differently in this revision of C++[.](#strings-2.sentence-3)
Some const member functions, such as data and c_str,
no longer invalidate iterators[.](#strings-2.sentence-4)
### [C.6.12](#containers) [[containers]](containers "23Containers library"): containers library [[diff.cpp03.containers]](diff.cpp03.containers)
[1](#containers-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2557)
**Affected subclause:** [[container.requirements]](container.requirements)
**Change:** Complexity of size() member functions now constant[.](#containers-1.sentence-1)
**Rationale:** Lack of specification of complexity of size() resulted in
divergent implementations with inconsistent performance characteristics[.](#containers-1.sentence-2)
**Effect on original feature:** Some container implementations that conform to C++ 2003 may not conform to the
specified size() requirements in this revision of C++[.](#containers-1.sentence-3)
Adjusting
containers such as std::list to the stricter requirements may require
incompatible changes[.](#containers-1.sentence-4)
[2](#containers-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2569)
**Affected subclause:** [[container.requirements]](container.requirements)
**Change:** Requirements change: relaxation[.](#containers-2.sentence-1)
**Rationale:** Clarification[.](#containers-2.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that attempts to meet the specified container requirements
may now be over-specified[.](#containers-2.sentence-3)
Code that attempted to be portable across containers
may need to be adjusted as follows:
- [(2.1)](#containers-2.1)
not all containers provide size(); use empty() instead
of size() == 0;
- [(2.2)](#containers-2.2)
not all containers are empty after construction (array);
- [(2.3)](#containers-2.3)
not all containers have constant complexity for swap() (array)[.](#containers-2.sentence-4)
[3](#containers-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2585)
**Affected subclause:** [[container.requirements]](container.requirements)
**Change:** Requirements change: default constructible[.](#containers-3.sentence-1)
**Rationale:** Clarification of container requirements[.](#containers-3.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that attempts to explicitly instantiate a container using
a user-defined type with no default constructor may fail to compile[.](#containers-3.sentence-3)
[4](#containers-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2594)
**Affected subclauses:** [[sequence.reqmts]](sequence.reqmts) and [[associative.reqmts]](associative.reqmts)
**Change:** Signature changes: from void return types[.](#containers-4.sentence-1)
**Rationale:** Old signature threw away useful information that may be expensive
to recalculate[.](#containers-4.sentence-2)
**Effect on original feature:** The following member functions have changed:
- [(4.1)](#containers-4.1)
erase(iter) for set, multiset, map, multimap
- [(4.2)](#containers-4.2)
erase(begin, end) for set, multiset, map, multimap
- [(4.3)](#containers-4.3)
insert(pos, num, val) for vector, deque, list, forward_list
- [(4.4)](#containers-4.4)
insert(pos, beg, end) for vector, deque, list, forward_list
Valid C++ 2003 code that relies on these functions returning void (e.g., code that creates a pointer to member function that points to one
of these functions) will fail to compile with this revision of C++[.](#containers-4.sentence-4)
[5](#containers-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2613)
**Affected subclauses:** [[sequence.reqmts]](sequence.reqmts) and [[associative.reqmts]](associative.reqmts)
**Change:** Signature changes: from iterator to const_iterator parameters[.](#containers-5.sentence-1)
**Rationale:** Overspecification[.](#containers-5.sentence-2)
**Effect on original feature:** The signatures of the following member functions changed from taking aniterator to taking a const_iterator:
- [(5.1)](#containers-5.1)
insert(iter, val) for vector, deque, list,set, multiset, map, multimap
- [(5.2)](#containers-5.2)
insert(pos, beg, end) for vector, deque, list,forward_list
- [(5.3)](#containers-5.3)
erase(begin, end) for set, multiset, map, multimap
- [(5.4)](#containers-5.4)
all forms of list::splice
- [(5.5)](#containers-5.5)
all forms of list::merge
Valid C++ 2003 code that uses these functions may fail to compile with this
revision of C++[.](#containers-5.sentence-4)
[6](#containers-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2635)
**Affected subclauses:** [[sequence.reqmts]](sequence.reqmts) and [[associative.reqmts]](associative.reqmts)
**Change:** Signature changes: resize[.](#containers-6.sentence-1)
**Rationale:** Performance, compatibility with move semantics[.](#containers-6.sentence-2)
**Effect on original feature:** For vector, deque, and list the fill value passed to resize is now passed by reference instead of
by value, and an additional overload of resize has been added[.](#containers-6.sentence-3)
Valid
C++ 2003 code that uses this function may fail to compile with this revision of C++[.](#containers-6.sentence-4)
### [C.6.13](#algorithms) [[algorithms]](algorithms "26Algorithms library"): algorithms library [[diff.cpp03.algorithms]](diff.cpp03.algorithms)
[1](#algorithms-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2648)
**Affected subclause:** [[algorithms.general]](algorithms.general)
**Change:** Result state of inputs after application of some algorithms[.](#algorithms-1.sentence-1)
**Rationale:** Required by new feature[.](#algorithms-1.sentence-2)
**Effect on original feature:** A valid C++ 2003 program may detect that an object with a valid but
unspecified state has a different valid but unspecified state with this
revision of C++[.](#algorithms-1.sentence-3)
For example, std::remove andstd::remove_if may leave the tail of the input sequence with a
different set of values than previously[.](#algorithms-1.sentence-4)
### [C.6.14](#numerics) [[numerics]](numerics "29Numerics library"): numerics library [[diff.cpp03.numerics]](diff.cpp03.numerics)
[1](#numerics-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2662)
**Affected subclause:** [[complex.numbers]](complex.numbers)
**Change:** Specified representation of complex numbers[.](#numerics-1.sentence-1)
**Rationale:** Compatibility with C99[.](#numerics-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that uses implementation-specific knowledge about the
binary representation of the required template specializations ofstd::complex may not be compatible with this revision of C++[.](#numerics-1.sentence-3)
### [C.6.15](#locale) [[localization]](localization "28.3Localization library"): localization library [[diff.cpp03.locale]](diff.cpp03.locale)
[1](#locale-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2674)
**Affected subclause:** [[facet.num.get.virtuals]](facet.num.get.virtuals)
**Change:** The num_get facet recognizes hexadecimal floating point values[.](#locale-1.sentence-1)
**Rationale:** Required by new feature[.](#locale-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code may have different behavior in this revision of C++[.](#locale-1.sentence-3)
### [C.6.16](#input.output) [[input.output]](input.output "31Input/output library"): input/output library [[diff.cpp03.input.output]](diff.cpp03.input.output)
[1](#input.output-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2684)
**Affected subclauses:** [[istream.sentry]](istream.sentry), [[ostream.sentry]](ostream.sentry), and [[iostate.flags]](iostate.flags)
**Change:** Specify use of explicit in existing boolean conversion functions[.](#input.output-1.sentence-1)
**Rationale:** Clarify intentions, avoid workarounds[.](#input.output-1.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that relies on implicit boolean conversions will fail to
compile with this revision of C++[.](#input.output-1.sentence-3)
Such conversions occur in the
following conditions:
- [(1.1)](#input.output-1.1)
passing a value to a function that takes an argument of type bool;
- [(1.2)](#input.output-1.2)
using operator== to compare to false or true;
- [(1.3)](#input.output-1.3)
returning a value from a function with a return type of bool;
- [(1.4)](#input.output-1.4)
initializing members of type bool via aggregate initialization;
- [(1.5)](#input.output-1.5)
initializing a const bool& which would bind to a temporary object[.](#input.output-1.sentence-4)
[2](#input.output-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2701)
**Affected subclause:** [[ios.failure]](ios.failure)
**Change:** Change base class of std::ios_base::failure[.](#input.output-2.sentence-1)
**Rationale:** More detailed error messages[.](#input.output-2.sentence-2)
**Effect on original feature:** std::ios_base::failure is no longer derived directly fromstd::exception, but is now derived from std::system_error,
which in turn is derived from std::runtime_error[.](#input.output-2.sentence-3)
Valid C++ 2003 code
that assumes that std::ios_base::failure is derived directly fromstd::exception may execute differently in this revision of C++[.](#input.output-2.sentence-4)
[3](#input.output-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2713)
**Affected subclause:** [[ios.base]](ios.base)
**Change:** Flag types in std::ios_base are now bitmasks with values
defined as constexpr static members[.](#input.output-3.sentence-1)
**Rationale:** Required for new features[.](#input.output-3.sentence-2)
**Effect on original feature:** Valid C++ 2003 code that relies on std::ios_base flag types being
represented as std::bitset or as an integer type may fail to compile
with this revision of C++[.](#input.output-3.sentence-3)
[*Example [1](#input.output-example-1)*: #include <iostream>int main() {int flag = std::ios_base::hex;
std::cout.setf(flag); // error: setf does not take argument of type int} — *end example*]