[expr.prim.this] (original) (raw)

7 Expressions [expr]

7.5 Primary expressions [expr.prim]

7.5.3 This [expr.prim.this]

The keyword this names a pointer to the object for which an implicit object member function ([class.mfct.non.static]) is invoked or a non-static data member's initializer ([class.mem]) is evaluated.

The current class at a program point is the class associated with the innermost class scope containing that point.

It shall not appear within the declaration of a static or explicit object member function of the current class (although its type and value category are defined within such member functions as they are within an implicit object member function).

[Note 2:

This is because declaration matching does not occur until the complete declarator is known.

— _end note_]

[Note 3:

Class members declared later are not visible.

[Example 1: 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_]

— _end note_]

Otherwise, if a member-declarator declares a non-static data member ([class.mem]) of a class X, the expression this is a prvalue of type “pointer to X” wherever X is the current class within the optional default member initializer ([class.mem]).

The expression this shall not appear in any other context.

[Example 2: class Outer { int a[sizeof(*this)]; unsigned int sz = sizeof(*this); void f() { int b[sizeof(*this)]; struct Inner { int c[sizeof(*this)]; };} }; — _end example_]