Annex C (informative) Compatibility [diff]

C.1 C++ and ISO C [diff.iso]

C.1.4 Clause [expr]: expressions [diff.expr]

[expr.call]
Change: Implicit declaration of functions is not allowed.

Rationale: The type-safe nature of C++.

Effect on original feature: Deletion of semantically well-defined feature.
Note: the original feature was labeled as “obsolescent” in ISO C.

Difficulty of converting: Syntactic transformation.
Facilities for producing explicit function declarations are fairly widespread commercially.

How widely used: Common.
[expr.post.incr], [expr.pre.incr]
Change: Decrement operator is not allowed with bool operand.

Rationale: Feature with surprising semantics.

Effect on original feature: A valid ISO C expression utilizing the decrement operator on a bool lvalue (for instance, via the C typedef in <stdbool.h>) is ill-formed in this International Standard.
[expr.sizeof], [expr.cast]
Change: Types must be defined in declarations, not in expressions.

In C, a sizeof expression or cast expression may define a new type.
For example,
p = (void*)(struct x {int i;} *)0;
defines a new type, struct x.

Rationale: This prohibition helps to clarify the location of definitions in the source code.

Effect on original feature: Deletion of semantically well-defined feature.

Difficulty of converting: Syntactic transformation.

How widely used: Seldom.
[expr.cond], [expr.ass], [expr.comma]
Change: The result of a conditional expression, an assignment expression, or a comma expression may be an lvalue.

Rationale: C++ is an object-oriented language, placing relatively more emphasis on lvalues.
For example, functions may return lvalues.

Effect on original feature: Change to semantics of well-defined feature.
Some C expressions that implicitly rely on lvalue-to-rvalue conversions will yield different results.
For example,
char arr[100];
sizeof(0, arr)
yields 100 in C++ and sizeof(char*) in C.

Difficulty of converting: Programs must add explicit casts to the appropriate rvalue.

How widely used: Rare.