我正在研究我的代码的常量正确性,只是想知道为什么这段代码会编译:
class X
{
int x;
int& y;
public:
X(int& _y):y(_y)
{
}
void f(int& newY) const
{
//x = 3; would not work, that's fine
y = newY; //does compile. Why?
}
};
int main(int argc, char **argv)
{
int i1=0, i2=0;
X myX(i1);
myX.f(i2);
...
}
据我所知,f()正在改变对象myX,尽管它说是const。当我给y赋值时,我如何确保我的编译器报错?(Visual C++ 2008)
非常感谢!
发布于 2010-03-12 17:29:34
因为您没有更改X
中的任何变量。实际上,您正在更改_y
,它相对于您的类来说是一个局外人。不要忘记这一点:
y = newY;
是将newY
的值赋给y
所指向的变量,而不是它们自己的引用。只有在初始化时才会考虑引用。
发布于 2010-03-12 17:51:07
这种情况类似于指针成员。在常量成员函数中,常量应用于指针本身,而不是被指针对象。
这是两者之间的区别:
X* const //this is how the const applies: you can modify the pointee
const X*
除了X& const
不是有效的语法,因为引用一开始就不能引用另一个对象(它们总是隐式的常量)。结论: const on方法对成员引用没有影响。
https://stackoverflow.com/questions/2431596
复制相似问题