const_cast преобразование
Преобразует типы с различной квалификацией cv.
Синтаксис
const_cast< тип-результата
>( выражение
)
|
Возвращает значение типа тип-результата.
Объяснение
С помощью const_cast можно выполнить только следующие преобразования.
T1 и T2, прзначение типа T1 может быть преобразовано к T2, если, учитывая разложения по квалификаторам обоих типов, каждый P1_i совпадает с P2_i для всех i. Результат ссылается на исходную сущность.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{}); // OKT1 и T2, если указатель на T1 может быть явно преобразован к типу «указатель на T2» с использованием const cast<T2*>, то также могут быть выполнены следующие преобразования:
- Л-значение типа
T1может быть явно преобразовано к л-значению типаT2с помощью const_cast<T2&>. - Гл-значение типа
T1может быть явно преобразовано к кс-значению типаT2с помощью const_cast<T2&&>. - Если
T1является типом класса, прзначение типаT1может быть явно преобразовано к кс-значению типаT2с помощью const_cast<T2&&>.
|
Результат ссылки относится к исходному объекту. |
(до C++17) |
|
Если выражение является гл-значением, результат ссылки относится к исходному объекту. В противном случае, результат ссылки относится к материализованному временному объекту. |
(с C++17) |
Как и при всех выражениях преобразования, результат:
- является л-значением, если тип-результата является типом ссылки на л-значение или ссылкой на р-значение типа функции(с C++11);
|
(с C++11) |
- является пр-значением в противном случае.
Удаление константности
Для двух различных типов T1 и T2, преобразование из T1 в T2 удаляет константность, если существует разложение по квалификаторам типа T2 в виде «cv2_0 P2_0 cv2_1 P2_1 ... cv2_n−1 P2_n−1 cv2_n U2», и не существует преобразований квалификаторов, которые преобразуют T1 в «cv2_0 P1_0 cv2_1 P1_1 ... cv2_n−1 P1_n−1 cv2_n U1» (одинаковые компоненты cv, разные компоненты P и U).
Если преобразование из пр-значения типа T1* к типу T2* удаляет константность, то const_cast для ссылок (пункт (2)) также удаляет константность.
Для удаления константности может быть использован только const_cast.
«Удаление константности» подразумевает «удаление изменчивости», так как преобразования квалификаторов не могут удалить изменчивость.
Примечания
Указатели на функции и указатели на члены функций не подлежат преобразованию const_cast.
const_cast позволяет сформировать ссылку или указатель на тип без константности, который фактически ссылается на объект с константой или ссылку или указатель на тип без изменчивости, который фактически ссылается на объект с изменчивостью. Модификация объекта с константой через путь доступа без константы и ссылка на объект с изменчивостью через гл-значение без изменчивости приводит к неопределенному поведению.
Ключевые слова
Пример
#include <iostream>
struct type
{
int i;
type(): i(3) {}
void f(int v) const
{
// this->i = v; // compile error: this is a pointer to const
const_cast<type*>(this)->i = v; // OK as long as the type object isn't const
}
};
int main()
{
int i = 3; // i is not declared const
const int& rci = i;
const_cast<int&>(rci) = 4; // OK: modifies i
std::cout << "i = " << i << '\n';
type t; // if this was const type t, then t.f(4) would be undefined behavior
t.f(4);
std::cout << "type::i = " << t.i << '\n';
const int j = 3; // j is declared const
[[maybe_unused]]
int* pj = const_cast<int*>(&j);
// *pj = 4; // undefined behavior
[[maybe_unused]]
void (type::* pmf)(int) const = &type::f; // pointer to member function
// const_cast<void(type::*)(int)>(pmf); // compile error: const_cast does
// not work on function pointers
}Вывод:
i = 4 type::i = 4
См. также
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/const_cast