[diff.cpp03.expr] # Annex C (informative) Compatibility [[diff]](./#diff) ## C.6 C++ and ISO C++ 2003 [[diff.cpp03]](diff.cpp03#expr) ### C.6.3 [[expr]](expr "7 Expressions"): expressions [diff.cpp03.expr] [1](#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[.](#1.sentence-1) **Rationale:** Removing surprising interactions with templates and constant expressions[.](#1.sentence-2) **Effect on original feature:** Valid C++ 2003 code may fail to compile or produce different results in this revision of C++[.](#1.sentence-3) [*Example [1](#example-1)*: void f(void *); // #1void f(...); // #2template void g() { f(0*N); // calls #2; used to call #1} — *end example*] [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2217) **Affected subclause:** [[expr.typeid]](expr.typeid) **Change:** Evaluation of operands in typeid[.](#2.sentence-1) **Rationale:** Introduce additional expression value categories[.](#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++[.](#2.sentence-3) [*Example [2](#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](#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 %[.](#3.sentence-1) **Rationale:** Increase portability, C99 compatibility[.](#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[.](#3.sentence-3) [4](#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.3 Simple type specifiers [dcl.type.simple]")[.](#4.sentence-1) **Rationale:** Required for new features[.](#4.sentence-2) **Effect on original feature:** Valid C++ 2003 code may fail to compile or produce different results in this revision of C++[.](#4.sentence-3) [*Example [3](#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](#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[.](#5.sentence-1) **Rationale:** Introduce additional expression value categories[.](#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++[.](#5.sentence-3) [*Example [4](#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*]