12 Classes [class]

12.2 Class members [class.mem]

12.2.2 Non-static member functions [class.mfct.non-static]

12.2.2.1 The this pointer [class.this]

В теле нестатического member functionключевого слова ключевое слово this представляет собой выражение prvalue, значение которого является адресом объекта, для которого вызывается функция. Типа this в функции - члене класса X есть X*. Если функция-член объявлена const, типом this является const X*, если функция-член объявлена volatile, типом this является volatile X*, а если функция-член объявлена const volatile, типом this является const volatile X*. [ Note: Таким образом, в const функции-члене доступ к объекту, для которого вызывается функция, осуществляется через const путь доступа. ] [ end noteExample:

struct s {
  int a;
  int f() const;
  int g() { return a++; }
  int h() const { return a++; } // error
};

int s::f() const { return a; }

В a++ теле s​::​h неправильно сформирован, потому что он пытается изменить (часть) объекта, для которого s​::​h() вызывается. Это недопустимо в const функции-члене, потому что this это указатель на const; то есть *this имеет const тип. ]end example

Аналогичным образом volatile семантика применяется в volatile функциях-членах при доступе к объекту и его нестатическим элементам данных.

Функция-член с квалификацией cv может быть вызвана object-expression только в том случае, если объект-выражение имеет квалификацию cv или менее квалификацию cv, чем функция-член. [Example:

void k(s& x, const s& y) {
  x.f();
  x.g();
  y.f();
  y.g();                        // error
}

Вызов y.g() плохо сформирован, потому что y является const и s​::​g() являетсяconst функцией, не являющейся членом, то s​::​g() есть менее квалифицированной, чем объект-выражение y. ]end example

Constructors и destructors не объявляются const, volatile или const volatile. [ Note: Тем не менее, эти функции могут быть вызваны для создания и уничтожения объектов с Cv квалифицированных типов см [class.ctor] и [class.dtor]. ]end note