8 Expressions [expr]

8.2 Postfix expressions [expr.post]

8.2.11 Const cast [expr.const.cast]

Результат выраженияconst_­cast<T>(v) имеет тип T. ЕслиT это lvalue ссылка на тип объекта, результатом будет lvalue; еслиT это ссылка rvalue на тип объекта, результатом будет xvalue; в противном случае результатом является prvalue lvalue-to-rvalue,array-to-pointerиfunction-to-pointer для выражения выполняются стандартные преобразованияv. Преобразования, которые можно выполнить явно с помощью const_­cast , перечислены ниже. Никакое другое преобразование не должно выполняться явно с использованиемconst_­cast.

Note: соответствии с ограничениями в этом разделе выражение может быть приведено к собственному типу с помощьюconst_­cast оператора. ]end note

Для двухsimilar typesT1 иT2prvalue типаT1 может быть явно преобразовано в типT2 с помощьюconst_­cast. Результатconst_­cast ссылается на исходную сущность. [Example:

typedef int *A[3];               // array of 3 pointer to int
typedef const int *const CA[3];  // array of 3 const pointer to const int

CA &&r = A{}; // OK, reference binds to temporary array object after qualification conversion to type CA
A &&r1 = const_cast<A>(CA{});    // error: temporary array decayed to pointer
A &&r2 = const_cast<A&&>(CA{});  // OK

end example]

Для двух типов объектовT1 иT2, если указатель наT1 может быть явно преобразован в тип «указатель наT2» с помощью a const_­cast, то также могут быть выполнены следующие преобразования:

  • lvalue типаT1 может быть явно преобразовано в lvalue типаT2 с помощью приведенияconst_­cast<T2&>;

  • glvalue типаT1 может быть явно преобразован в xvalue типаT2 с помощью приведенияconst_­cast<T2&&>; а также

  • еслиT1 это тип класса, prvalue типаT1 можно явно преобразовать в xvalue типаT2 с помощью приведения const_­cast<T2&&>.

Результат ссылкиconst_­cast относится к исходному объекту, если операнд является значением glvalue, и к результату применения вtemporary materialization conversion противном случае.

Anull pointer value преобразуется в значение нулевого указателя целевого типа. null member pointer value Преобразуются в значение указателя члена нуля типа назначения.

[ Note: В зависимости от типа объекта операция записи через указатель, lvalue или указатель на член данных в результате, const_­cast который отбрасывает константный квалификатор,76 может привести к неопределенному поведению ([dcl.type.cv]). ]end note

Преобразование из типаT1 к типу ,T2 casts away constness еслиT1 иT2 различны, естьcv-decomposition изT1 получаяn таким образом, что T2 имеет CV-разложение вида cv20P20cv21P21cv2n1P2n1cv2nU2, и нет квалификации преобразования , который преобразуетT1 с cv20P10cv21P11cv2n1P1n1cv2nU1.

Преобразование lvalue типаT1 в lvalue типа T2 с использованием ссылочного преобразования lvalue или преобразование из выражения типаT1 в xvalue типаT2 с использованием ссылочного преобразования rvalue отбрасывает константность, если преобразование из prvalue типа «указатель наT1» на тип «указатель на T2» отбрасывает константность.

[ Note: Некоторые преобразования, которые включают только изменения в cv-квалификации, не могут быть выполнены с использованием.const_­cast. Например, преобразования между указателями на функции не рассматриваются, потому что такие преобразования приводят к значениям, использование которых вызывает неопределенное поведение. По тем же причинам преобразования между указателями на функции-члены и, в частности, преобразование указателя на константную функцию-член в указатель на неконстантную функцию-член не рассматриваются. ]end note

const_­cast не ограничивается преобразованиями, которые отбрасывают квалификатор const.