const_cast 转换

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue 、右值 rvalue 、亡值 xvalue )
求值顺序(序列点)
常量表达式
不求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=ba+=ba-=ba*=ba/=ba%=ba&=ba|=ba^=ba<<=ba>>=b
自增与自减++a--aa++a--
算术运算符+a-aa+ba-ba*ba/ba%b~aa&ba|ba^ba<<ba>>b
逻辑运算符a||ba&&b!a
比较运算符a==ba!=ba<ba>ba<=ba>=b
成员访问运算符a[b]*a&aa->ba.ba->*ba.*b
其他运算符a(...)a,ba?b:c
运算符的替代表示形式
优先级和结合性
折叠表达式(C++17)
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
运算符重载
类型转换
隐式转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)aT(a)
用户定义转换
 

在有不同 cv 限定的类型间转换。

目录

[编辑] 语法

const_cast < new_type > ( expression )

返回 new_type 类型的值。

[编辑] 解释

仅下列转换可用 const_cast 进行。特别是,唯有 const_cast 可用于转型掉(移除)常性或易变性。

1) 二个指向同一类型的可能多级的指针可以互相转换,无关乎每个层级的 cv 限定符。
2) 任何 T 类型左值可转换为到同一类型 T 的左值或右值引用, cv 限定可更多或更少。同样地,右值可转换成更多或更少 cv 限定的右值引用。引用 const_cast 的结果指代原对象,若 expression 是泛左值,否则指代实质化的临时量 (C++17 起)
3) 同样的规则应用于可能多层的到数据成员的指针及可能多层的到已知和未知边界数组( cv 限定元素的数组被认为是自身亦有 cv 限定) (C++17 起)
4) 空指针值可转换成 new_type 的空指针值

同所有转型表达式,结果是:

  • 左值,若 new_type 是左值引用或到函数类型的右值引用;
  • 亡值,若 new_type 是到对象类型的右值引用;
  • 否则为纯右值。

[编辑] 注意

指向函数指针和指向成员函数指针不可用于 const_cast

const_cast 使得能够组成实际指代 const 对象 的到非 const 类型的引用或指针,或组成实际指代 volatile 对象的到非 volatile 类型的引用或指针。通过非 const 访问路径修改 const 对象和通过非 volatile 泛左值指代 volatile 对象是未定义行为。

[编辑] 关键词

const_cast

[编辑] 示例

#include <iostream>
 
struct type {
    type() :i(3) {}
    void m1(int v) const {
        // this->i = v;                 // 编译错误:这是指向 const 的指针
        const_cast<type*>(this)->i = v; // 只要对象不是 const 就 OK
    }
    int i;
};
 
int main() 
{
    int i = 3;                    // i 不声明为 const
    const int& cref_i = i; 
    const_cast<int&>(cref_i) = 4; // OK :修改 i
    std::cout << "i = " << i << '\n';
 
    type t; // note, if this is const type t;, then t.m1(4); is UB
    t.m1(4);
    std::cout << "type::i = " << t.i << '\n';
 
    const int j = 3; // j 声明为 const
    int* pj = const_cast<int*>(&j);
    // *pj = 4;         // 未定义行为!
 
    void (type::*mfp)(int) const = &type::m1; // 指向成员函数指针
//  const_cast<void(type::*)(int)>(mfp); // 编译错误: const_cast 对函数指针不起作用
}

输出:

i = 4
type::i = 4

[编辑] 参阅