在C++中:const引用是指"只读视图"还是需要引用对象的不变性?

Dmi*_*kin 5 c++

这个问题可以通过例子表示如下:这段代码是否有效?

int a = 1;
const int& ca = a;
++a; //< Q: Is this valid?
cout << "a: " << a << endl;
cout << "ca: " << ca << endl; // Q: Is it guaranteed to output "2"? Is it valid at all?
Run Code Online (Sandbox Code Playgroud)

使用MSVC和MinGW,上面的代码段按预期工作:如果我查询ca后缀,它返回2(即它被非const引用更改).但问题是:从标准的角度考虑这种情况如何?是否可以,我们改变对象,我们有const引用(或者我们必须定义ca为const的易失性参考,以使代码片段正确)?

因此,如果上面的代码片段是正确的,那么这意味着,const引用不保证,引用的对象是常量.它只禁止我们通过给定的引用来改变它,即建立引用对象的"只读"视图.它是否正确?

编辑:
感谢所有回答我问题的人.答案陈述了这件事,这对我来说似乎很自然.但是我真的很感激有人提到c ++标准中的特定条款.

Edit2:
扩展了原始示例,使问题的概念更加清晰.

Edit3
另一个例子,最初出现在我对Mats Peterson答案的评论中.

class MyClass {
public:
    // ...
    const X& getX() const;
    void modifyX();
private:
    X m_x;
};

void someFun() {
    //...
    MyClass myObj = ... // non-cons
    const X& x = myObj.getX();
    // ...
    myObj.modifyX(); // Q: is `x` guaranteed to track value of x stored in myObj here?
}
Run Code Online (Sandbox Code Playgroud)

问题是:是否允许在优化期间编译以删除x变量的更新,因为它已声明const?例如,如果type Xbool,则按x值存储提供比通过引用存储更好的性能和更少的内存消耗.

换句话说:是否有保证,如果后续调用修改内部值的方法,局部变量x将跟踪内部相应内部值的变化?myObjmyObj

jua*_*nza 5

这是有效的代码,因为a不是const.一个const参考意味着你不能修改refered,通过参考对象.