views:

162

answers:

3

I am working on const-correctness of my code and just wondered why this code compiles:

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);
...
}

As far as I understand, f() is changing the object myX, although it says to be const. How can I ensure my compiler complains when I do assign to y? (Visual C++ 2008)

Thank a lot!

+10  A: 

Because you are not changing any variable in X. Actually, you are changing _y which is an outsider with respect to your class. Don't forget that:

y = newY;

Is assigning the value of newY to the variable pointed by y, but not the references them selves. Only on initialization the references are considered.

AraK
roe
thanks. I think what I really wanted is a pointer as a member.
Philipp
Of course, y could be made to refer to a class member, and then it would be modifying the state of the class. It just so happens that in this example it doesn't.
visitor
A: 

this may help you

const member function

mihirpmehta
A: 

The situation is similar to pointer members. In a const member function, the const applies to the pointer itself, not the pointee.

It's the difference between:

X* const //this is how the const applies: you can modify the pointee
const X*

Except X& const isn't valid syntax, since the reference can't be made to refer to another object in the first place (they are implicitly always const). In conclusion: const on methods has no effect on member references.

visitor