这个问题可以通过例子表示如下:这段代码是否有效?
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 X为bool,则按x值存储提供比通过引用存储更好的性能和更少的内存消耗.
换句话说:是否有保证,如果后续调用修改内部值的方法,局部变量x将跟踪内部相应内部值的变化?myObjmyObj
| 归档时间: |
|
| 查看次数: |
1237 次 |
| 最近记录: |