const_cast conversion
康斯特[医]铸造转换
在具有不同cv限定条件的类型之间进行转换。
句法
const_cast < new_type > ( expression ) | | |
---|
返回类型的值。new_type
...
解释
只有以下转换可以使用const_cast
特别是,只有const_cast
可用于丢弃%28删除%29的稳定性或波动性。
1%29两个可能是多层指针的相同类型的指针可以相互转换,而不考虑每个级别的cv-限定符。
任何类型的2%29升T
可以转换为同类型的lvalue或rvalue引用。T
,或多或少符合简历的条件。同样,rvalue可以转换为或多或少cv限定的rvalue引用.。引用的结果const_cast
如果表达式是glvalue,则引用原始对象,并引用物化临时否则,%28自C++17%29。
3%29相同的规则适用于数据成员的可能多级指针,可能的多级指针适用于已知和未知绑定%28数组的数组,到cv限定元素的数组被认为是cv-限定自身%29%28,因为C++17%29。
4%29空指针值可转换为新的空指针值。[医]类型
与所有强制转换表达式一样,结果是:
- 如果是新的[医]类型是lvalue引用类型或函数类型的rvalue引用;
- 如果是新的xvalue[医]类型是对对象类型的rvalue引用;
- 要价不一样。
注记
指向函数的指针和指向成员函数的指针不受const_cast
...
const_cast
使之能够形成一个引用或指针,该引用或指针指向实际引用的非Const类型。Const对象或指向非易失性类型的引用或指针,该引用或指针实际上是指挥发性物体通过非const访问路径修改const对象,并通过非易失性引用易失性对象。极值导致行为不明。
关键词
const_cast
...
例
二次
#include <iostream>
struct type {
type() :i(3) {}
void m1(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 i;
};
int main()
{
int i = 3; // i is not declared const
const int& cref_i = i;
const_cast<int&>(cref_i) = 4; // OK: modifies i
std::cout << "i = " << i << '\n';
type t; // note, if this is const type t;, then t.m1(4 is UB
t.m1(4
std::cout << "type::i = " << t.i << '\n';
const int j = 3; // j is declared const
int* pj = const_cast<int*>(&j
// *pj = 4; // undefined behavior!
void (type::*mfp)(int) const = &type::m1; // pointer to member function
// const_cast<void(type::*)(int)>(mfp // compiler error: const_cast does not
// work on function pointers
}
二次
产出:
二次
i = 4
type::i = 4
二次
另见
- 静态[医]铸造
- 动态[医]铸造
- 重释[医]铸造
- 显式铸造
- 隐式转换
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。