explicit type conversion

From cppreference.com
< cpp‎ | language

Converts between types using a combination of explicit and implicit conversions.


[edit] Syntax

( new_type ) expression (1)
new_type ( expression ) (2)
new_type ( expressions ) (3)
new_type ( ) (4)
new_type { expression-list(optional) } (5) (since C++11)

Returns a value of type new_type.

[edit] Explanation

1) When the C-style cast expression is encountered, the compiler attempts to interpret it as the following cast expressions, in this order:
a) const_cast<new_type>(expression)
b) static_cast<new_type>(expression), with extensions: pointer or reference to a derived class is additionally allowed to be cast to pointer or reference to unambiguous base class (and vice versa) even if the base class is inaccessible (that is, this cast ignores the private inheritance specifier). Same applies to casting pointer to member to pointer to member of unambigous non-virtual base
c) static_cast (with extensions) followed by const_cast
d) reinterpret_cast<new_type>(expression)
e) reinterpret_cast followed by const_cast
The first choice that satisfies the requirements of the respective cast operator is selected, even if it cannot be compiled (see example). If the cast can be interpreted in more than one way as static_cast followed by a const_cast, it cannot be compiled.
In addition, C-style cast notation is allowed to cast from, to, and between pointers to incomplete class type. If both expression and new_type are pointers to incomplete class types, it's unspecified whether static_cast or reinterpret_cast gets selected.
2) The functional cast consists of a simple type specifier or a typedef specifier (in other words, a single-word type name: unsigned int(expression) or int*(expression) are not valid), followed by a single expression in parentheses. This cast is exactly equivalent to the corresponding C-style cast expression.
3) If there are more than one expression in parentheses, new_type must be a class with a suitably declared constructor. This expression creates a temporary object of type new_type direct initialized with expressions, and the result is that temporary object as a prvalue.
4) The expression T(), where T names a non-array complete object type or (possibly cv-qualified) void, creates a prvalue of type T. If T is a object type, the prvalue is value-initialized; otherwise, no initialization is done.
5) A single-word type name followed by a braced-init-list returns a temporary of the specified type direct-list-initialized with the specified braced-init-list.

As with all cast expressions, the result is:

  • an lvalue if new_type is an lvalue reference type or an rvalue reference to function type;
  • an xvalue if new_type is an rvalue reference to object type;
  • a prvalue otherwise.

[edit] Example

double f = 3.14;
unsigned int n1 = (unsigned int)f; // C-style cast
unsigned int n2 = unsigned(f);     // functional cast
class C1;
class C2;
C2* foo(C1* p)
    return (C2*)p; // casts incomplete type to incomplete type
// In this example, C-style cast is interpreted as static_cast
// even though it would work as reinterpret_cast
struct A {};
struct I1 : A {};
struct I2 : A {};
struct D : I1, I2 {};
int main()
   D* d = nullptr;
   A* a = (A*)d;                   // compile-time error
   A* a = reinterpret_cast<A*>(d); // this compiles

[edit] References

  • C++11 standard (ISO/IEC 14882:2011):
  • 5.2.3 Explicit type conversion (functional notation) [expr.type.conv]
  • 5.4 Explicit type conversion (cast notation) [expr.cast]
  • C++98 standard (ISO/IEC 14882:1998):
  • 5.2.3 Explicit type conversion (functional notation) [expr.type.conv]
  • 5.4 Explicit type conversion (cast notation) [expr.cast]

[edit] See also

const_cast conversion adds or removes const
static_cast conversion performs basic conversions
dynamic_cast conversion performs checked polymorphic conversions
reinterpret_cast conversion performs general low-level conversions
standard conversions implicit conversions from one type to another
C documentation for cast operator