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

语法

const_cast < 新类型 > ( 表达式 )

返回 新类型 类型的值。

解释

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

1) 两个指向同一类型的可能多级的指针可以互相转换,无关乎每个层级的 cv 限定符。

2) 任何 T 类型的左值可转换为到同一类型 T 的左值或右值引用,cv 限定可更多或更少。同样地,类类型纯右值或任何类型的亡值可转换成具有更多或更少 cv 限定的右值引用。引用 const_cast 的结果指代原对象,若 表达式 是泛左值,否则指代实质化的临时量 (C++17 起)。

3) 同样的规则适用于可能多层的到数据成员的指针,及可能多层的到已知和未知边界数组(cv 限定元素的数组被认为是自身亦有 cv 限定) (C++17 起)

4) 空指针值可转换成 新类型 的空指针值

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

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

注解

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

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

关键词

const_cast

示例

运行此代码

  1. #include <iostream>
  2.  
  3. struct type {
  4. int i;
  5.  
  6. type(): i(3) {}
  7.  
  8. void f(int v) const {
  9. // this->i = v; // 编译错误:this 是指向 const 的指针
  10. const_cast<type*>(this)->i = v; // 只要该对象不是 const 就 OK
  11. }
  12. };
  13.  
  14. int main()
  15. {
  16. int i = 3; // 不声明 i 为 const
  17. const int& rci = i;
  18. const_cast<int&>(rci) = 4; // OK:修改 i
  19. std::cout << "i = " << i << '\n';
  20.  
  21. type t; // 假如这是 const type t,则 t.f(4) 会是未定义行为
  22. t.f(4);
  23. std::cout << "type::i = " << t.i << '\n';
  24.  
  25. const int j = 3; // 声明 j 为 const
  26. int* pj = const_cast<int*>(&j);
  27. // *pj = 4; // 未定义行为
  28.  
  29. void (type::* pmf)(int) const = &type::f; // 指向成员函数的指针
  30. // const_cast<void(type::*)(int)>(pmf); // 编译错误:const_cast 不在成员函数指针上工作
  31. }

输出:

  1. i = 4
  2. type::i = 4