Ключевое слово 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 note Example:
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 ]