非const对象的const成员能否使用const_cast去除const限定?
关于const_cast修改非const实例的const成员的行为分析
先明确两个大家熟知的场景:
- 修改真正的const对象会触发未定义行为(UB):
const int i = 0; const_cast<int&>(i) = 42; // 未定义行为 - 通过const引用修改底层的非const对象是完全合法的:
int i = 0; const int &ri = i; const_cast<int&>(ri) = 42; // 合法,i的值将被改为42
根据cppreference对const对象的定义:
const对象是指:
- 类型被const限定的对象,或
- const对象的非mutable子对象。
此类对象不可被修改:直接修改会触发编译错误,间接修改(如通过非const类型的引用或指针)会导致未定义行为。
核心问题解答
非const类实例的const成员属于const对象。哪怕外层的类实例f不是const的,它的成员const int c本身是带有const限定的对象,完全符合上述定义里“类型被const限定的对象”这一条。
所以你给出的这段代码:
struct Foo { const int c = 0; }; Foo f = {13}; const_cast<int&>(f.c) = 42; // 未定义行为
行为是未定义的——因为f.c是const对象,通过const_cast移除const限定后修改它,属于间接修改const对象,会触发未定义行为。
内容的提问来源于stack exchange,提问作者yrHeTateJlb
相关产品推荐
相关产品推荐

