Результат выражения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-разложение вида cv20P20cv21P21⋯cv2n−1P2n−1cv2nU2, и нет квалификации преобразования , который преобразуетT1 с cv20P10cv21P11⋯cv2n−1P1n−1cv2nU1.
Преобразование lvalue типаT1 в lvalue типа T2 с использованием ссылочного преобразования lvalue или преобразование из выражения типаT1 в xvalue типаT2 с использованием ссылочного преобразования rvalue отбрасывает константность, если преобразование из prvalue типа «указатель наT1» на тип «указатель на T2» отбрасывает константность.
[ Note: Некоторые преобразования, которые включают только изменения в cv-квалификации, не могут быть выполнены с использованием.const_cast. Например, преобразования между указателями на функции не рассматриваются, потому что такие преобразования приводят к значениям, использование которых вызывает неопределенное поведение. По тем же причинам преобразования между указателями на функции-члены и, в частности, преобразование указателя на константную функцию-член в указатель на неконстантную функцию-член не рассматриваются. ] — end note
const_cast не ограничивается преобразованиями, которые отбрасывают квалификатор const.