命名空间
变体
操作

const_cast 转换

来自 cppreference.com
< cpp‎ | language
 
 
C++ 语言
 
 

在具有不同 cv 限定的类型之间进行转换。

内容

[编辑] 语法

const_cast< 目标类型 >( 表达式 )

返回类型为 目标类型 的值。

[编辑] 解释

只有以下转换可以使用 const_cast 进行。

1) 对于两个 相似类型 T1T2,如果 T1T2 仅在 cv 限定符方面有所不同(正式地说,如果考虑两种类型的 限定符分解,对于所有 i,每个 P1_i 都与 P2_i 相同),则可以将类型为 T1 的右值转换为 T2。结果引用原始实体。
2) 对于两个对象类型 T1T2,如果可以将指向 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 属性

对于两种不同的类型T1T2,从T1T2的转换会去除 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 对象会导致未定义的行为。

[编辑] 关键字

const_cast

[编辑] 示例

#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]

[编辑] 另请参阅