Подтвердить что ты не робот

Изменение ссылочного элемента из функции const member в С++

Я работаю над const-корректностью моего кода и просто задаюсь вопросом, почему этот код компилируется:

class X
{
    int x;
    int& y;
public:
    X(int& _y):y(_y)
    {
    }
void f(int& newY) const
    {
        //x = 3; would not work, that 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 С++ 2008)

Спасибо большое!

4b9b3361

Ответ 1

Потому что вы не меняете какую-либо переменную в X. Фактически, вы меняете _y, который является аутсайдером по отношению к вашему классу. Не забывайте, что:

y = newY;

Назначает значение newY переменной, указанной y, но не относится к ним. Только при инициализации рассматриваются ссылки.

Ответ 2

Ситуация похожа на элементы указателя. В const-функции-член const применяется к самому указателю, а не к pointee.

Это различие между:

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

За исключением X& const недействителен синтаксис, поскольку ссылка не может быть сделана, чтобы ссылаться на другой объект в первую очередь (они неявно всегда const). В заключение: const на методах не влияет на ссылки на члены.