const_cast 转换
来自cppreference.com
在有不同 cv 限定的类型间转换。
语法
const_cast< 新类型 >( 表达式 )
|
|||||||||
返回 新类型 类型的值。
解释
只有下列转换能用 const_cast 进行。尤其是只有 const_cast 可以用来移除常量性或易变性。
1) 两个指向同一类型的可能多级的指针可以互相转换,不受每个层级的 cv 限定符影响。
2) 任何
T
类型的左值可转换为到同一类型 T
的左值或右值引用,cv 限定可更多或更少。同样地,类类型纯右值或任何类型的亡值可转换成具有更多或更少 cv 限定的右值引用。引用 const_cast 的结果指代原对象 (C++17 前)在 表达式 是泛左值时指代原对象,否则指代实质化的临时量 (C++17 起)。3) 同样的规则适用于可能多层的到数据成员的指针,及可能多层的到已知和未知边界数组(cv 限定元素的数组自身也被认为有 cv 限定) (C++17 起)。
4) 空指针值可转换成 新类型 的空指针值。
同所有转型表达式,结果是:
- 左值,如果 新类型 是左值引用类型或到函数类型的右值引用类型 (C++11 起);
|
(C++11 起) |
- 否则是纯右值。
注解
函数指针和成员函数指针无法用于 const_cast。
const_cast 使得到非 const 类型的引用或指针能够实际指代 const 对象,或到非 volatile 类型的引用或指针能够实际指代 volatile 对象。通过非 const 访问路径修改 const 对象和通过非 volatile 泛左值涉指 volatile 对象是未定义行为。
关键词
示例
运行此代码
#include <iostream> struct type { int i; type(): i(3) {} void f(int v) const { // this->i = v; // 编译错误:this 是指向 const 的指针 const_cast<type*>(this)->i = v; // 只要该对象不是 const 就 OK } }; int main() { int i = 3; // 不声明 i 为 const const int& rci = i; const_cast<int&>(rci) = 4; // OK:修改 i std::cout << "i = " << i << '\n'; type t; // 如果这是 const type t,那么 t.f(4) 会是未定义行为 t.f(4); std::cout << "type::i = " << t.i << '\n'; const int j = 3; // 声明 j 为 const [[maybe_unused]] int* pj = const_cast<int*>(&j); // *pj = 4; // 未定义行为 [[maybe_unused]] void (type::* pmf)(int) const = &type::f; // 指向成员函数的指针 // const_cast<void(type::*)(int)>(pmf); // 编译错误:const_cast 不能用于成员函数指针 }
输出:
i = 4 type::i = 4