const_cast conversion

来自cppreference.com
< cpp‎ | language

 
 
C++语言

|- class="t-nv-h1" | colspan="5" | 一般主题 |- | |- |

预处理器
注释

|

|-

|- class="t-nv-h1" | colspan="5" | 流程控制 |-

条件执行语句

| |- |

|

|-

循环语句

| |- |

|

|-

跳转语句

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 函数 |-

函数声明 Lambda函数声明 inline说明符 异常说明符 (已弃用) noexcept说明符 (C++11)

|- class="t-nv-h1" | colspan="5" | Exceptions |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 命名空间 |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类型 |- | |- |

|

|-

说明符

| |- |

decltype (C++11)
auto (C++11)
alignas (C++11)

|

|-

存储持续期说明符 Initialization

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 表达式 |- | |- |

值类别
求值顺序

|

|-

替代表示 字面量 布尔型 - 整型 - 浮点型 字符型 - 字符串 - nullptr (C++11) 用户定义 (C++11)

|- class="t-nv-h1" | colspan="5" | Utilities |-

属性 (C++11) Types typedef声明 类型别名声明 (C++11) Casts 隐式类型转换 - 显示类型转换 static_cast - dynamic_cast const_cast - reinterpret_cast 内存分配

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类 |- | |- |

|

|-

类特有的函数属性

| |- |

|

explicit (C++11)
static

|-

静态成员函数

| |- |

|

|- |- class="t-nv-h1" | colspan="5" | 模板 |- | |- |

|

|- |- class="t-nv-h1" | colspan="5" | 杂项 |- | |- |

|

|-

 

提供同一类型,不同的const、volatile限定符之间的转换.

目录

[编辑] 语法

const_cast < new_type > ( expression )

返回new_type类型的值.

[编辑] 解释

const_cast操作只适用于下列类型间的转换。尤其是,只有const_cast才可以把const、volatile修饰的类型转换为普通类型.

1) 对于两个相同类型的多级指针,如果它们仅仅在某些级别上的const、volatile修饰符不同,就可以互相转换.
2) 任何类型T的左值可以被被转换到一个相同类型T,但const、volatile修饰符不相同的左值或右值引用。同样地,一个右值也可以转换成一个const、volatile修饰符不相同的右值引用.
3) 此规则也同样适用于多级指针.
4) 空指针值可转换为new_type的空指针值.
与所有的强制转换表达式,其结果是:
原文:
As with all cast expressions, the result is:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 注释

const_cast不适用于函数指针和成员函数指针.

虽然const_cast可以去除任何指针的const限制,但如果通过转换后的指针或引用来改写一个const对象,依然可能导致未定义的意外行为.

[编辑] 关键字

const_cast

[编辑] 示例

#include <iostream>
 
struct type {
    type() :i(3) {}
    void m1(int v) const {
        // this->i = v;                 // 编译错误: this是一个const指针
        const_cast<type*>(this)->i = v; // 可行
    }
    int i;
};
 
int main() 
{
    int i = 3;                    // 此处的i不是const类型
    const int& cref_i = i; 
    const_cast<int&>(cref_i) = 4; // 可行: 修改了i的值
    std::cout << "i = " << i << '\n';
 
    type t;
    t.m1(4);
    std::cout << "type::i = " << t.i << '\n';
 
    const int j = 3; // j是const类型
    int* pj = const_cast<int*>(&j);
    *pj = 4;         // 改写const变量的值,可能会导致意外情况发生!
 
    void (type::*mfp)(int) const = &type::m1; // 成员函数指针
//  const_cast<void(type::*)(int)>(mfp); // 编译错误: const_cast不能用于函数指针
}

输出:

i = 4
type::i = 4

[编辑] 另请参阅

来自“http://zh.cppreference.com/mwiki/index.php?title=cpp/language/const_cast&oldid=39041