Результат выражения имеет тип . Результатом является lvalue, если это ссылочный тип lvalue, или ссылка rvalue на тип функции и xvalue, если ссылка rvalue на тип объекта; в противном случае результатом будет prvalue. [ Если это неклассовый тип, квалифицированный cv, при определении типа результирующего prvalue отбрасываются; см. пункт . ] (T) cast-expression T T T Note: 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]), является некорректным.
Преобразования, выполненные
а const_cast,
а static_cast,
а, static_cast за которым следует const_cast,
а reinterpret_cast, или
а, reinterpret_cast за которым следует const_cast,
может выполняться с использованием нотации приведения явного преобразования типа. Применяются те же семантические ограничения и поведение, за исключением того, что при выполнении 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