Пространства имён
Варианты
Действия

const_cast conversion

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Конвертирует между различными типами резюме квалификации.
Оригинал:
Converts between types with different cv-qualification.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Синтаксис

const_cast < new_type > ( expression )
Возвращает значение типа new_type.
Оригинал:
Returns a value of type new_type.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Объяснение

Только следующие преобразования может быть сделано с const_cast. В частности, только const_cast могут быть использованы для отбросить (убрать) константность или волатильность.
Оригинал:
Only the following conversions can be done with const_cast. In particular, only const_cast may be used to cast away (remove) constness or volatility.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
1)
Два возможности многоуровневых указателей на того же типа могут быть преобразованы друг с другом, независимо от CV-отборочные на каждом уровне.
Оригинал:
Two possibly multilevel pointers to the same type may be converted between each other, regardless of cv-qualifiers at each level.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
именующее любого типа T могут быть преобразованы в ссылки именующее или RValue к тому же T типа, более или менее CV-квалификации. Кроме того, RValue могут быть преобразованы в более или менее резюме квалифицированных RValue ссылки.
Оригинал:
lvalue of any type T may be converted to a lvalue or rvalue reference to the same type T, more or less cv-qualified. Likewise, an rvalue may be converted to a more or less cv-qualified rvalue reference.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3)
Те же правила применяются к возможности многоуровневых указателей на члены данных.
Оригинал:
Same rules apply to possibly multilevel pointers to data members.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
4)
нулевое значение указателя может быть преобразовано в нулевое значение указателя new_type
Оригинал:
null pointer value may be converted to the null pointer value of new_type
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Как и во всех литых выражения, результат
Оригинал:
As with all cast expressions, the result is:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • именующее если new_type является тип именующее ссылку или RValue ссылка на функцию типа
    Оригинал:
    an lvalue if new_type is an lvalue reference type or an rvalue reference to function type;
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • xvalue если new_type является RValue ссылку на объект типа
    Оригинал:
    an xvalue if new_type is an rvalue reference to object type;
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • prvalue иначе.
    Оригинал:
    a prvalue otherwise.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Заметки

Указатели на функции и указатели на функции-члены не подлежат const_cast
Оригинал:
Pointers to functions and pointers to member functions are not subject to const_cast
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Даже если const_cast может удалить константность от любого указателя или ссылки, используя полученный указатель или ссылку на запись в объект, который был объявлен const вызывает неопределенное поведение.
Оригинал:
Even though const_cast may remove constness from any pointer or reference, using the resulting pointer or reference to write to an object that was declared const invokes undefined behavior.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Ключевые слова

const_cast

[править] Пример

#include <iostream>
 
struct type {
    type() :i(3) {}
    void m1(int v) const {
        // this->i = v;                 // compile error: this is a pointer to const
        const_cast<type*>(this)->i = v; // OK
    }
    int i;
};
 
int main()
{
    int i = 3;                    // i is not declared const
    const int& cref_i = i;
    const_cast<int&>(cref_i) = 4; // OK: modifies i
    std::cout << "i = " << i << '\n';
 
    type t;
    t.m1(4);
    std::cout << "type::i = " << t.i << '\n';
 
    const int j = 3; // j is declared const
    int* pj = const_cast<int*>(&j);
    *pj = 4;         // undefined behavior!
 
    void (type::*mfp)(int) const = &type::m1; // pointer to member function
//  const_cast<void(type::*)(int)>(mfp); // compiler error: const_cast does not
                                         // work on function pointers
}

Вывод:

i = 4
type::i = 4

[править] См. также