Annex C (informative) Compatibility [diff] (original) (raw)

C.6 C++ and ISO C++ 2003 [diff.cpp03]

C.6.1 General [diff.cpp03.general]

Subclause [diff.cpp03] lists the differences between C++ and ISO C++ 2003, in addition to those listed above, by the chapters of this document.

C.6.2 [lex]: lexical conventions [diff.cpp03.lex]

Affected subclause: [lex.pptoken]

Rationale: Required for new features.

Effect on original feature: Valid C++ 2003 code may fail to compile or produce different results in this revision of C++.

Specifically, macros named R, u8,u8R, u, uR, U, UR, or LR will not be expanded when adjacent to a string-literal but will be interpreted as part of the string-literal.

[Example 1: #define u8 "abc" const char* s = u8"def"; — _end example_]

Affected subclause: [lex.pptoken]

Change: User-defined literal string support.

Rationale: Required for new features.

Effect on original feature: Valid C++ 2003 code may fail to compile or produce different results in this revision of C++.

[Example 2: #define _x "there" "hello"_x

Previously, #1 would have consisted of two separate preprocessing tokens and the macro _x would have been expanded.

In this revision of C++, #1 consists of a single preprocessing token, so the macro is not expanded.

— _end example_]

Affected subclause: [lex.key]

Change: New keywords.

Rationale: Required for new features.

Effect on original feature: Added to Table 5, the following identifiers are new keywords:alignas,alignof,char16_t,char32_t,constexpr,decltype,noexcept,nullptr,static_assert, andthread_local.

Valid C++ 2003 code using these identifiers is invalid in this revision of C++.

Affected subclause: [lex.icon]

Change: Type of integer literals.

Rationale: C99 compatibility.

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.

C.6.3 [expr]: expressions [diff.cpp03.expr]

Affected subclause: [conv.ptr]

Change: Only literals are integer null pointer constants.

Rationale: Removing surprising interactions with templates and constant expressions.

Effect on original feature: Valid C++ 2003 code may fail to compile or produce different results in this revision of C++.

[Example 1: void f(void *); void f(...); template<int N> void g() { f(0*N); } — _end example_]

Affected subclause: [expr.typeid]

Change: Evaluation of operands in typeid.

Rationale: Introduce additional expression value categories.

Effect on original feature: Valid C++ 2003 code that uses xvalues as operands for typeidmay change behavior in this revision of C++.

[Example 2: void f() { struct B { B() {} virtual ~B() { } };struct C { B b; };typeid(C().b); } — _end example_]

Affected subclause: [expr.mul]

Change: Specify rounding for results of integer / and %.

Rationale: Increase portability, C99 compatibility.

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.

Affected subclause: [expr.log.and]

Rationale: Required for new features.

Effect on original feature: Valid C++ 2003 code may fail to compile or produce different results in this revision of C++.

[Example 3: bool b1 = new int && false; struct S { operator int(); };bool b2 = &S::operator int && false; — _end example_]

Affected subclause: [expr.cond]

Change: Fewer copies in the conditional operator.

Rationale: Introduce additional expression value categories.

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++.

[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; } — _end example_]

C.6.4 [dcl]: declarations [diff.cpp03.dcl.dcl]

Affected subclause: [dcl.spec]

Change: Remove auto as a storage class specifier.

Rationale: New feature.

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++.

In this revision of C++,auto indicates that the type of a variable is to be deduced from its initializer expression.

Affected subclause: [dcl.init.list]

Change: Narrowing restrictions in aggregate initializers.

Rationale: Catches bugs.

Effect on original feature: Valid C++ 2003 code may fail to compile in this revision of C++.

[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.

— _end example_]

Affected subclause: [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.

Rationale: Alignment with user expectations.

Effect on original feature: Valid C++ 2003 code may violate the one-definition rule ([basic.def.odr]) in this revision of C++.

[Example 2: namespace { extern "C" { extern int x; } } namespace A { extern "C" int x = 42; } int main(void) { return x; }

This code is valid in C++ 2003, but #2 is not a definition for #1in this revision of C++, violating the one-definition rule.

— _end example_]

C.6.5 [class]: classes [diff.cpp03.class]

Affected subclauses: [class.default.ctor], [class.dtor], [class.copy.ctor], and [class.copy.assign]

Change: Implicitly-declared special member functions are defined as deleted when the implicit definition would have been ill-formed.

Rationale: Improves template argument deduction failure.

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.

Affected subclause: [class.dtor]

Change: User-declared destructors have an implicit exception specification.

Rationale: Clarification of destructor requirements.

Effect on original feature: Valid C++ 2003 code may execute differently in this revision of C++.

In particular, destructors that throw exceptions will call std​::​terminate(without calling std​::​unexpected) if their exception specification is non-throwing.

C.6.6 [temp]: templates [diff.cpp03.temp]

Affected subclause: [temp.param]

Rationale: No implementation consensus for the C++ 2003 meaning of export.

Effect on original feature: A valid C++ 2003 program containing export is ill-formed in this revision of C++.

Affected subclause: [temp.arg]

Change: Remove whitespace requirement for nested closing template right angle brackets.

Rationale: Considered a persistent but minor annoyance.

Template aliases representing non-class types would exacerbate whitespace issues.

Effect on original feature: Change to semantics of well-defined expression.

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.

[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.

— _end example_]

Affected subclause: [temp.dep.candidate]

Change: Allow dependent calls of functions with internal linkage.

Rationale: Overly constrained, simplify overload resolution rules.

Effect on original feature: A valid C++ 2003 program can get a different result in this revision of C++.

C.6.7 [library]: library introduction [diff.cpp03.library]

Change: New reserved identifiers.

Rationale: Required by new features.

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++.

A comprehensive list of identifiers used by the C++ standard library can be found in the Index of Library Names in this document.

Affected subclause: [headers]

Change: New headers.

Rationale: New functionality.

Effect on original feature: The following C++ headers are new:,,,,,,<initializer_list> ([initializer.list.syn]),,,,,,,,,<typeindex> ([type.index.synopsis]),,, and.

In addition the following C compatibility headers are new:,,, and.

Valid C++ 2003 code that #includes headers with these names may be invalid in this revision of C++.

Affected subclause: [swappable.requirements]

Change: Function swap moved to a different header.

Rationale: Remove dependency on for swap.

Effect on original feature: Valid C++ 2003 code that has been compiled expecting swap to be in may have to instead include .

Affected subclause: [namespace.posix]

Change: New reserved namespace.

Rationale: New functionality.

Effect on original feature: The global namespace posix is now reserved for standardization.

Valid C++ 2003 code that uses a top-level namespace posix may be invalid in this revision of C++.

Affected subclause: [macro.names]

Change: Additional restrictions on macro names.

Rationale: Avoid hard to diagnose or non-portable constructs.

Effect on original feature: Names of attribute identifiers may not be used as macro names.

Valid C++ 2003 code that defines override, final, ornoreturn as macros is invalid in this revision of C++.

C.6.8 [support]: language support library [diff.cpp03.language.support]

Affected subclause: [new.delete.single]

Change: operator new may throw exceptions other thanstd​::​bad_alloc.

Rationale: Consistent application of noexcept.

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++.

Valid C++ 2003 code that replaces the global replaceable operator newis ill-formed in this revision of C++, because the exception specification of throw(std​::​bad_alloc)was removed.

C.6.9 [diagnostics]: diagnostics library [diff.cpp03.diagnostics]

Affected subclause: [errno]

Change: Thread-local error numbers.

Rationale: Support for new thread facilities.

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++.

C.6.11 [strings]: strings library [diff.cpp03.strings]

Affected subclause: [string.classes]

Change: basic_string requirements no longer allow reference-counted strings.

Rationale: Invalidation is subtly different with reference-counted strings.

This change regularizes behavior.

Effect on original feature: Valid C++ 2003 code may execute differently in this revision of C++.

Affected subclause: [string.require]

Change: Loosen basic_string invalidation rules.

Rationale: Allow small-string optimization.

Effect on original feature: Valid C++ 2003 code may execute differently in this revision of C++.

Some const member functions, such as data and c_str, no longer invalidate iterators.

C.6.12 [containers]: containers library [diff.cpp03.containers]

Affected subclause: [container.requirements]

Change: Complexity of size() member functions now constant.

Rationale: Lack of specification of complexity of size() resulted in divergent implementations with inconsistent performance characteristics.

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++.

Adjusting containers such as std​::​list to the stricter requirements may require incompatible changes.

Affected subclause: [container.requirements]

Change: Requirements change: relaxation.

Rationale: Clarification.

Effect on original feature: Valid C++ 2003 code that attempts 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:

Affected subclause: [container.requirements]

Change: Requirements change: default constructible.

Rationale: Clarification of container requirements.

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.

Affected subclauses: [sequence.reqmts] and [associative.reqmts]

Change: Signature changes: from void return types.

Rationale: Old signature threw away useful information that may be expensive to recalculate.

Effect on original feature: The following member functions have changed:

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++.

Affected subclauses: [sequence.reqmts] and [associative.reqmts]

Change: Signature changes: from iterator to const_iteratorparameters.

Rationale: Overspecification.

Effect on original feature: The signatures of the following member functions changed from taking aniterator to taking a const_iterator:

Valid C++ 2003 code that uses these functions may fail to compile with this revision of C++.

Affected subclauses: [sequence.reqmts] and [associative.reqmts]

Change: Signature changes: resize.

Rationale: Performance, compatibility with move semantics.

Effect on original feature: For vector, deque, and listthe fill value passed to resize is now passed by reference instead of by value, and an additional overload of resize has been added.

Valid C++ 2003 code that uses this function may fail to compile with this revision of C++.

C.6.13 [algorithms]: algorithms library [diff.cpp03.algorithms]

Affected subclause: [algorithms.general]

Change: Result state of inputs after application of some algorithms.

Rationale: Required by new feature.

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++.

For example, std​::​remove andstd​::​remove_if may leave the tail of the input sequence with a different set of values than previously.

C.6.14 [numerics]: numerics library [diff.cpp03.numerics]

Affected subclause: [complex.numbers]

Change: Specified representation of complex numbers.

Rationale: Compatibility with C99.

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++.

C.6.15 [localization]: localization library [diff.cpp03.locale]

Affected subclause: [facet.num.get.virtuals]

Change: The num_get facet recognizes hexadecimal floating point values.

Rationale: Required by new feature.

Effect on original feature: Valid C++ 2003 code may have different behavior in this revision of C++.

C.6.16 [input.output]: input/output library [diff.cpp03.input.output]

Affected subclauses: [istream.sentry], [ostream.sentry], and [iostate.flags]

Change: Specify use of explicit in existing boolean conversion functions.

Rationale: Clarify intentions, avoid workarounds.

Effect on original feature: Valid C++ 2003 code that relies on implicit boolean conversions will fail to compile with this revision of C++.

Such conversions occur in the following conditions:

Affected subclause: [ios.failure]

Change: Change base class of std​::​ios_base​::​failure.

Rationale: More detailed error messages.

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.

Valid C++ 2003 code that assumes that std​::​ios_base​::​failure is derived directly fromstd​::​exception may execute differently in this revision of C++.

Affected subclause: [ios.base]

Change: Flag types in std​::​ios_base are now bitmasks with values defined as constexpr static members.

Rationale: Required for new features.

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++.

[Example 1: #include <iostream> int main() { int flag = std::ios_base::hex; std::cout.setf(flag); } — _end example_]