You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:49:57