8 Expressions [expr]

8.1 Primary expressions [expr.prim]

8.1.2 This [expr.prim.this]

Ключевое слово this именует указатель на объект, для которого вызывается нестатическая функция-член или[class.mem]оценивается инициализатор ( ) нестатического элемента данных .

Если объявление объявляет функцию-член или шаблон функции-члена класса X, выражение this представляет собой prvalue типа «указатель на cv-qualifier-seq X» между необязательным cv-qualifier-seqи концом function-definition, member-declaratorили declarator. Он не должен появляться перед необязательным cv-qualifier-seqи не должен появляться в объявлении статической функции-члена (хотя ее тип и категория значения определены в статической функции-члене, поскольку они находятся в нестатической функции-члене). [ Note: Это связано с тем, что сопоставление деклараций не происходит до тех пор, пока не будет известен полный декларатор. ] В отличие от объектного выражения в других контекстах, не требуется, чтобы он был полного типа для целей вне тела функции-члена. [ Видны только члены класса, объявленные до объявления. ] [ end note *this class member access Note: end noteExample:

struct A {
  char g();
  template<class T> auto f(T t) -> decltype(t + g())
    { return t + g(); }
};
template auto A::f(int t) -> decltype(t + g());

end example]

В противном случае, если a member-declaratorобъявляет нестатический data member класс X, выражение this является prvalue типа «указатель на X» внутри необязательного default member initializer. Он не должен появляться где-либо еще в member-declarator.

Выражение this не должно появляться ни в каком другом контексте. [Example:

class Outer {
  int a[sizeof(*this)];               // error: not inside a member function
  unsigned int sz = sizeof(*this);    // OK: in default member initializer

  void f() {
    int b[sizeof(*this)];             // OK

    struct Inner {
      int c[sizeof(*this)];           // error: not inside a member function of Inner
    };
  }
};

end example]