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

为何const对象的非const成员引用可被修改?

问题解析

先看给出的代码:

struct S{int x;int& y;};
int main(){
    int i=6;
    const S s{5,i};//(1)
    //s.x=10;//(2) 编译错误
    s.y=99;//(3) 编译通过
}

造成这种差异的核心原因在于const对不同类型成员的影响规则:

  • 对于普通成员s.x:当对象s被声明为const时,s.x会被视为const int类型——也就是只读的整数,所以尝试修改它的语句(2)会触发编译错误,这符合const对象的只读语义。
  • 对于引用成员s.y:引用的本质是变量的别名,它本身一旦绑定就无法更改绑定目标。当s是const对象时,const修饰的是引用这个成员本身,但引用本身已经具备“不可修改绑定”的特性,所以这个const不会给引用带来额外限制。而s.y指向的原对象i是一个非const的int,通过引用修改这个原对象的值(也就是语句(3)的操作),本质上并没有修改const对象s的成员(引用本身没被改动),只是修改了引用指向的外部对象,这完全符合C++的语法规则。

总结来说:const对象的const属性限制的是对象自身成员的修改,但引用成员的“修改”是指更改绑定目标,而通过引用修改指向对象的值不属于修改const对象的成员,因此是允许的。

内容的提问来源于stack exchange,提问作者Kory

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:10:25