問題は、のthis
内部にあるのdecltype
ではなく、関数本体の外部にあるようです。
たとえば、以下のコードはGCC4.7でコンパイルされます。
struct A
{
int f() { return 0; }
auto g() -> decltype(f()) {
decltype(this->f()) var = this->f();
return var;
}
};
これはの本体のdecltype(this->f())
内部g
で使用されますが、フォームでの関数の戻り型の指定auto .... -> ....
、つまりいわゆる末尾の戻り型の指定は関数本体の一部ではなく、GCCでは許可されていません。
ただし、C ++標準は実際には関数本体で使用する必要がないように見えます(コメントの説明を参照) :オプションのconst/volatile修飾子と最後の間のどこでも使用できるthis
標準状態の§5.1.1this
関数本体の、以下の節3を参照してください。(完全を期すために、データメンバーについて説明し、質問に直接関係しない条項4も追加しました)。
(条項3)宣言がクラスXのメンバー関数またはメンバー関数テンプレートを宣言する場合、式this
は、オプションのcv-qualifer-seqとの終わりの間の「pointertocv-qualifier-seqX」タイプのprvalueです。関数定義、メンバー宣言子、または宣言子。オプションのcv-qualifier-seqの前に表示
してはならず、静的メンバー関数の宣言内に表示してはなりません(ただし、そのタイプと値のカテゴリは、非静的メンバー関数内にあるため、静的メンバー関数内で定義されます)。 。[...]
(4節)それ以外の場合、member-declaratorがクラスXの非静的データメンバー(9.2)を宣言する場合、式thisは、オプションのbrace-or-equal-initializer内の「pointertoX」型のprvalueです。メンバー宣言者の他の場所には表示されないものとします。
(第5条)これは他のいかなる文脈においても現れてはならないという表現。[...]
注意:オプションのcv-qualifier-seq、つまり関数のconst
orvolatile
修飾子は、Jesseがコメントで指摘しているように、末尾の戻り型宣言の前に表示する必要があります。したがってthis
、質問で説明されている方法で使用することは正しいはずであり、GCCは間違っているようです。