关于C++的一个简单问题,涉及const_cast
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C++的一个简单问题,涉及const_cast相关的知识,希望对你有一定的参考价值。
这里的const_cast是什么用法啊,const_cast不是去除底层const的作用吗,这里怎么反倒显示转化为const 引用了
参考技术Aconst_cast conversion
Converts between types with different cv-qualification.
Syntax
const_cast < new_type > ( expression )
Returns a value of type new_type.
Explanation
Only the following conversions can be done with const_cast. In particular, only const_cast may be used to cast away (remove) constness or volatility.
1) Two possibly multilevel pointers to the same type may be converted between each other, regardless of cv-qualifiers at each level.2) lvalue of any type T may be converted to a lvalue or rvalue reference to the same type T, more or less cv-qualified. Likewise, an rvalue may be converted to a more or less cv-qualified rvalue reference. The result of a reference const_cast refers to the original object if expression is a glvalue and to the materialized temporaryotherwise (since C++17).3) Same rules apply to possibly multilevel pointers to data members and possibly multilevel pointers to arrays of known and unknown bound (arrays to cv-qualified elements are considered to be cv-qualified themselves) (since C++17)4) null pointer value may be converted to the null pointer value of new_type
As with all cast expressions, the result is:
an lvalue if new_type is an lvalue reference type or an rvalue reference to function type;
an xvalue if new_type is an rvalue reference to object type;
a prvalue otherwise.
Notes
Pointers to functions and pointers to member functions are not subject to const_cast
const_cast makes it possible to form a reference or pointer to non-const type that is actually referring to a const object or a reference or pointer to non-volatile type that is actually referring to a volatile object. Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior.
Keywords
const_cast
Example
Run this code
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
Output:
i = 4 type::i = 4
以上是关于关于C++的一个简单问题,涉及const_cast的主要内容,如果未能解决你的问题,请参考以下文章
static_castdynamic_castreinterpret_cast和const_cast
C++的类型转换:static_castdynamic_castreinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的con
const_cast,static_cast,dynamic_cast,reinterpret_cast的区别
C++中四种类型转换符:static_castdynamic_castreinterpret_cast和const_cast要点解析