问题可以通过示例表述如下:这段代码有效吗?
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?
对于 MSVC 和 MinGW,上面的代码片段按预期工作:如果我查询 ca 后记,它返回 2(即它被非常量引用更改)。但问题是:如何从标准的角度考虑这种情况?我们是否可以更改对象,我们有 const 引用(或者例如,我们必须将 ca 定义为 const volatile 引用以使代码片段正确)?
所以,如果上面的片段是正确的,那么这意味着,const 引用并不能保证引用的对象是常量。它只是禁止我们通过给定的引用来更改它,即建立引用对象的“只读” View 。这是正确的吗?
编辑:
感谢所有回答我问题的人。答案说明了事情,这对我来说似乎很自然。但是我真的很感激有人引用了 c++ 标准中的特定条款。
编辑2:
扩展了原始示例以使问题的思路更加清晰。
编辑3
另一个例子,最初出现在我对 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?
}
问题是:是否允许编译器在优化期间删除 x 变量的更新,因为它被声明为 const?例如。如果类型 X 是 bool,则按值存储 x 比按引用存储提供更好的性能和更少的内存消耗。
换句话说:如果后续调用 myObj 的方法,是否保证局部变量 修改那个内部值?x 将跟踪 myObj 中相应内部值的变化
最佳答案
这是有效代码,因为a 不是const。 const 引用意味着您不能通过引用修改引用对象。
关于c++ - 在 C++ 中 : Is const reference means "read-only view of" or it requires immutability of object being referenced?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22436856/