Spec-Zone.ru › C++

const_cast преобразование

Преобразует типы с различной квалификацией cv.

Синтаксис

const_cast< тип-результата >( выражение )

Возвращает значение типа тип-результата.

Объяснение

С помощью const_cast можно выполнить только следующие преобразования.

1) Для двух одинаковых типов 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{}); // OK
2) Для двух типов объектов T1 и 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)
3) Значение нулевого указателя может быть преобразовано к значению нулевого указателя типа тип-результата. Значение нулевого указателя на член может быть преобразовано к значению нулевого указателя на член типа тип-результата.

Как и при всех выражениях преобразования, результат:

  • является л-значением, если тип-результата является типом ссылки на л-значение или ссылкой на р-значение типа функции(с 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 позволяет сформировать ссылку или указатель на тип без константности, который фактически ссылается на объект с константой или ссылку или указатель на тип без изменчивости, который фактически ссылается на объект с изменчивостью. Модификация объекта с константой через путь доступа без константы и ссылка на объект с изменчивостью через гл-значение без изменчивости приводит к неопределенному поведению.

Ключевые слова

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

См. также

  • static_cast
  • dynamic_cast
  • reinterpret_cast
  • явное преобразование
  • неявные преобразования

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/const_cast

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API