Converts between types with different cv-qualification.
[edit] Syntaxconst_cast<
target-type >(
expression )
Returns a value of type target-type.
[edit] ExplanationOnly the following conversions can be done with const_cast:
1)For two
similarobject pointer or pointer to data member types
T1
and
T2
, a prvalue of type
T1
can be converted to
T2
if
T1
and
T2
differ only in cv-qualification (formally, if, considering the
qualification-decompositionsof both types, each
P1_i
is the same as
P2_i
for all
i).
For two
object typesT1
and
T2
, if a pointer to
T1
can be explicitly converted to the type âpointer to
T2
â using
const_cast<T2*>, then the following conversions can also be made:
T1
can be explicitly converted to an lvalue of type T2
using const_cast<T2&>.T1
can be explicitly converted to an xvalue of type T2
using const_cast<T2&&>.T1
is a class or array type, a prvalue of type T1
can be explicitly converted to an xvalue of type T2
using const_cast<T2&&>.The result reference refers to the original object.
(until C++17)If expression is a glvalue, the result reference refers to the original object. Otherwise, the result reference refers to the materialized temporary.
(since C++17)As with all cast expressions, the result is:
For two different types T1
and T2
, a conversion from T1
to T2
casts away constness if there exists a qualification-decomposition of T2
of the form âcv2_0 P2_0 cv2_1 P2_1 ... cv2_nâ1 P2_nâ1 cv2_n U2â, and there is no qualification conversions that converts T1
to âcv2_0 P1_0 cv2_1 P1_1 ... cv2_nâ1 P1_nâ1 cv2_n U1â (same cv-components, different P-components and U-components).
If a cast from a prvalue of type T1*
to the type T2*
casts away constness, casting from an expression of type T1
to a reference to T2
will also cast away constness.
Only const_cast may be used to cast away constness.
âCasting away constnessâ implies âcasting away volatilityâ, as qualification conversions cannot cast away volatility as well.
[edit] NotesPointers 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.
[edit] Keywords [edit] Example#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 }
Output:
[edit] Defect reportsThe following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior CWG 1965 C++11 const_cast could not bind rvalue references to array prvalues allowed to bind such references CWG 2879 C++17 pointer pvalue operands were materialized they are not materialized [edit] ReferencesRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4