Const-функция не может изменить объект?

Цитата из Стандарта пункт 9.3.2
const member function shall not modify the object and its non-static data members
Т.е . const-функция не может изменить объект. А если так...
class myclass {public:    myclass(int b) {a=c=b;}    mutable int a; // can be modified by const-function because of MUTABLE    int c;           // cannot be modified by const-function    int foo_1() const; // cannot modify calling object    int foo_2(myclass&) const; //cannot modify calling object};int main(){        myclass m = 1;    myclass k = 2;    m.foo_1();    k.foo_2(k);    return 0;}int myclass::foo_1() const{    return a=111; // modifies mutable. It`s OK}int myclass::foo_2(myclass& r) const{    return r.c=222; // Modifies NOT MUTABLE!!!}
Да, с помощью *this мы бы не смогли такое проделать, и если бы написали вот так
int myclass::foo_2(const myclass& r) const
тоже бы получили ошибку, но при передаче по неконстантной ссылке, компилятор проглатывает это и в итоге имеем измененный объект myclass k. В итоге получается, что обошли константность функции.Что скажете на это, товарищи.
10 ответов

"shall not modify the object" -- Вероятно имеется в виду невозможность изменения именно объекта this, а не какого-то другого экземпляра?...


В итоге получается, что обошли константность функции.
не обошли - в данном случае k и k разные обьекты квалификатор const относится к this т.е если мы развернем функцию то  получится 
// функция   int foo_2(myclass&) const; // внутренне представлена примерно так:static int foo_2(const myclass *this,  myclass& ); // никаких противоречий с вашим примером


квалификатор const относится к this 
это бесспорно, но в итоге после возврата в main() имеем измененный 
myclass::k
, именно тот, который мы инициализировали как 
myclass k = 2;
и именно в нем k.c равна не 2, как в начале, а 222.


и именно в нем k.c равна не 2, как в начале, а 222. 
так в этом ничего удивительного нет..переменая не отмечена как constобъект не константныйссылка не константнаяa const у метода распространяется только на this


a const у метода распространяется только на this
может я стандарт плохо посмотрел, может ссылку кинешь?Ага нашел!Но тем не менее константность перехитрили   


Annihilator, вы не пробовали предложения целиком читать? Меня в школе учили, что они несут смысловое единство...
In a const member function, the object for which the function is called is accessed through a const access path; therefore, a const member function shall not modify the object and its non-static data members.


Ulysses4j
Ага нашел!


Но тем не менее константность перехитрили 
неа Вы нигде не нарушили константность, то что Вы продекларивали метод константным, не говорит что объект стал константнымваш пример аналогичен следуюшему (без классов)
void f (const int& a, int& b){   ++b;   cout << "const a = " << a <<endl;  //выводим значение переданой константы}...int i=5;f(i,i); //  получаем const a = 6 , обманули константность ??? 


Ulysses4j, ты не то привел.Вот это надо
The type of this in a member function of a class X is X*.  If the member function is declared const, the type of this is const  X*, if the member function is declared volatile, the type of this is volatile  X*, and if the member function is declared const  volatile, the type of this is const  volatile  X*.
mes, согласен. Обманули себя 


Annihilator, я привел первую часть той фразы, которая была цитирована в первом посте. И считаю, что это то.