16

(正常にコンパイルされます)

struct A
{
    void f() {};
    auto g() -> decltype(f())
    {}

};

質問

thisdecltype(つまり)内にポインタを追加すると、 gcc4.7.0decltype(this->f())で次のコンパイルエラーが発生します。

error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'
error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'

thisdecltypeでの使用は許可されていませんか?誰かが私に問題が何であるかを理解するのを手伝ってもらえますか?

編集

これはバグとして提出されました

4

2 に答える 2

12

問題は、の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、つまり関数のconstorvolatile修飾子は、Jesseがコメントで指摘しているように、末尾の戻り型宣言の前に表示する必要があります。したがってthis、質問で説明されている方法で使用することは正しいはずであり、GCCは間違っているようです。

于 2012-06-19T02:33:11.790 に答える
1

エラーメッセージは非常に明確に見えます。「this」は不完全な型である「structA」のインスタンスです(つまり、コンパイラは現在のパス中に構造体の解析を完了していません)。

于 2012-06-18T23:55:36.770 に答える