まず、すべてのメンバー アクセス式がコンパイラによって変換されます。
struct X{
int a;
void f(){}
void g(int b){
int x = a + b; // actually: int x = (*this).a + b
f(); // actually: (*this).f();
}
};
§9.3.1 [class.mfct.non-static] p3
[...] id-expression(*this)
は、 (9.3.2) を演算子の左側の後置式として使用して、クラス メンバー アクセス式 (5.2.5) に変換されます.
。[...]
ここで、標準の例では、末尾の戻り値の型で、別のメンバー関数の本体の外側でメンバー関数を呼び出します。そして、その呼び出しも変換されます。
template<class T> auto f(T t) -> decltype(t + (*this).g())
{ return t + (*this).g(); }
メンバー関数本体の外側では、*this
明らかに不完全な型です。これは、使用前に宣言された名前にのみアクセスできることを意味しますが、その部分は*this
使用にのみ適用されるわけではありません。
struct X{
using typeA = int;
typeA f(); // OK, 'typeA' has been declared before
typeB g(); // Error: 'typeB' not declared before usage
using typeB = float;
};