[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.sizeof], [expr.cast]
Change: Types must be declared in declarations, not in expressions
In C, a sizeof expression or cast expression may create a new type.
For example,
p = (void*)(struct x {int i;} *)0;
declares a new type, struct x .
Rationale:
This prohibition helps to clarify the location of
declarations in the source code.
Effect on original feature:
Deletion of a 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.