8 Expressions [expr]

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

Результат выражения имеет тип . Результатом является lvalue, если это ссылочный тип lvalue, или ссылка rvalue на тип функции и xvalue, если ссылка rvalue на тип объекта; в противном случае результатом будет prvalue. [ Если это неклассовый тип, квалифицированный cv, при определении типа результирующего prvalue отбрасываются; см. пункт . ] (T) cast-expression T T TNote: T cv-qualifiers [expr]end note

Явное преобразование типа может быть выражено с использованием functional notation, оператор преобразования типа (dynamic_­cast, static_­cast, reinterpret_­cast, const_­cast), или cast обозначения.

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

Любое преобразование типа, не упомянутое ниже и явно не определенное пользователем ([class.conv]), является некорректным.

Преобразования, выполненные

может выполняться с использованием нотации приведения явного преобразования типа. Применяются те же семантические ограничения и поведение, за исключением того, что при выполнении a static_­cast в следующих ситуациях преобразование допустимо, даже если базовый класс недоступен:

  • указатель на объект типа производного класса или lvalue или rvalue типа производного класса может быть явно преобразован в указатель или ссылку на однозначный тип базового класса, соответственно;

  • указатель на член типа производного класса может быть явно преобразован в указатель на член однозначного невиртуального типа базового класса;

  • указатель на объект однозначного типа невиртуального базового класса, glvalue однозначного типа невиртуального базового класса или указатель на член однозначного типа невиртуального базового класса может быть явно преобразован в указатель, ссылка или указатель на член типа производного класса соответственно.

Если преобразование можно интерпретировать более чем одним из способов, перечисленных выше, используется интерпретация, которая появляется первой в списке, даже если приведение в результате этой интерпретации неверно. Если преобразование может быть интерпретировано более чем одним способом как знак, static_­cast за которым следует знак const_­cast, преобразование сформировано неправильно. [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]

Операндом приведения с использованием нотации приведения может быть значение типа «указатель на неполный тип класса». Целевым типом приведения с использованием нотации приведения может быть «указатель на неполный тип класса». Если и операнд, и тип назначения являются типами классов и один или оба являются неполными, не указывается, используется ли интерпретация static_­cast или reinterpret_­cast интерпретация, даже если между двумя классами существует отношение наследования. [ Note: Например, если классы были определены позже в единице перевода, многопроходному компилятору было бы разрешено интерпретировать приведение между указателями на классы, как если бы типы классов были завершены в точке приведения. ]end note