8 Expressions [expr]

8.4 Explicit type conversion (cast notation) [expr.cast]

The result of the expression (T) cast-expression is of type T. The result is an lvalue if T is an lvalue reference type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type; otherwise the result is a prvalue. [ Note: If T is a non-class type that is cv-qualified, the cv-qualifiers are discarded when determining the type of the resulting prvalue; see Clause [expr].  — end note ]

An explicit type conversion can be expressed using functional notation, a type conversion operator (dynamic_Β­cast, static_Β­cast, reinterpret_Β­cast, const_Β­cast), or the cast notation.

cast-expression:
	unary-expression
	( type-id ) cast-expression

Any type conversion not mentioned below and not explicitly defined by the user ([class.conv]) is ill-formed.

The conversions performed by

can be performed using the cast notation of explicit type conversion. The same semantic restrictions and behaviors apply, with the exception that in performing a static_Β­cast in the following situations the conversion is valid even if the base class is inaccessible:

If a conversion can be interpreted in more than one of the ways listed above, the interpretation that appears first in the list is used, even if a cast resulting from that interpretation is ill-formed. If a conversion can be interpreted in more than one way as a static_Β­cast followed by a const_Β­cast, the conversion is ill-formed. [ Example:

struct A { };
struct I1 : A { };
struct I2 : A { };
struct D : I1, I2 { };
A* foo( D* p ) {
  return (A*)( p );             // ill-formed static_Β­cast interpretation
}

 — end example ]

The operand of a cast using the cast notation can be a prvalue of type β€œpointer to incomplete class type”. The destination type of a cast using the cast notation can be β€œpointer to incomplete class type”. If both the operand and destination types are class types and one or both are incomplete, it is unspecified whether the static_Β­cast or the reinterpret_Β­cast interpretation is used, even if there is an inheritance relationship between the two classes. [ Note: For example, if the classes were defined later in the translation unit, a multi-pass compiler would be permitted to interpret a cast between pointers to the classes as if the class types were complete at the point of the cast.  — end note ]