const_cast
转换
来自 cppreference.com
在具有不同 cv 限定的类型之间进行转换。
内容 |
[编辑] 语法
const_cast< 目标类型 >( 表达式 ) |
|||||||||
返回类型为 目标类型 的值。
[编辑] 解释
只有以下转换可以使用 const_cast 进行。
1) 对于两个 相似类型
T1
和 T2
,如果 T1
和 T2
仅在 cv 限定符方面有所不同(正式地说,如果考虑两种类型的 限定符分解,对于所有 i,每个 P1_i
都与 P2_i
相同),则可以将类型为 T1
的右值转换为 T2
。结果引用原始实体。2) 对于两个对象类型
T1
和 T2
,如果可以将指向 T1
的指针显式转换为类型“指向 T2
的指针”,使用 const_cast<T2*>,则还可以进行以下转换- 可以使用 const_cast<T2&> 将类型为
T1
的左值显式转换为类型为T2
的左值。 - 可以使用 const_cast<T2&&> 将类型为
T1
的通用左值显式转换为类型为T2
的右值。 - 如果
T1
是一个类类型,则可以使用 const_cast<T2&&> 将类型为T1
的右值显式转换为类型为T2
的右值。
结果引用引用原始对象。 |
(直到 C++17) |
如果 表达式 是一个通用左值,则结果引用引用原始对象。否则,结果引用引用 具象化的临时对象。 |
(自 C++17 起) |
3) 可以将空指针值转换为 目标类型 的空指针值。可以将空成员指针值转换为 目标类型 的空成员指针值。
与所有强制转换表达式一样,结果是
- 一个左值,如果 目标类型 是一个左值引用类型 或者指向函数类型的右值引用(自 C++11 起);
|
(自 C++11 起) |
- 否则为一个右值。
[编辑] 去除 const 属性
对于两种不同的类型T1
和T2
,从T1
到T2
的转换会去除 const 性,如果存在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 性,那么从类型为T1
的表达式到T2
的引用类型也会去除 const 性。
只有const_cast可以用来去除 const 性。
“去除 const 性”意味着“去除 volatile 性”,因为限定符转换也不能去除 volatile 性。
[编辑] 注释
指向函数的指针和指向成员函数的指针不受const_cast的影响。
const_cast可以使您能够形成指向非 const 类型的引用或指针,而该引用或指针实际上是指向一个const 对象,或者是指向非 volatile 类型的引用或指针,而该引用或指针实际上是指向一个volatile 对象。通过非 const 访问路径修改 const 对象,以及通过非 volatile glvalue引用 volatile 对象会导致未定义的行为。
[编辑] 关键字
[编辑] 示例
运行此代码
#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
[编辑] 参考文献
- C++23 标准 (ISO/IEC 14882:2024)
- 7.6.1.11 Const cast [expr.const.cast]
- C++20 标准 (ISO/IEC 14882:2020)
- 7.6.1.10 Const cast [expr.const.cast]
- C++17 标准 (ISO/IEC 14882:2017)
- 8.2.11 Const cast [expr.const.cast]
- C++14 标准 (ISO/IEC 14882:2014)
- 5.2.11 Const cast [expr.const.cast]
- C++11 标准 (ISO/IEC 14882:2011)
- 5.2.11 Const cast [expr.const.cast]
- C++98 标准 (ISO/IEC 14882:1998)
- 5.2.11 Const cast [expr.const.cast]
- C++03 标准 (ISO/IEC 14882:2003)
- 5.2.11 Const cast [expr.const.cast]