2

以下は、オブジェクトを定義していると思っていても、実際には関数を宣言している言語初心者によくあるタイプミスです。

struct T
{
   void foo() {}
};

int main()
{
   T obj();
   obj.foo();
}

GCC 4.1.2 のエラーは次のとおりです。

In function 'int main()':
Line 9: error: request for member 'foo' in 'obj', which is of non-class type 'T ()()'
compilation terminated due to -Wfatal-errors.

報告されたタイプがメッセージにあるのはなぜT ()()ですか? 私は期待していたでしょうT ()

4

2 に答える 2

5

IIRC これは単なるコンパイラのバグです。GCC 4.4 は言うがT()、4.2 はT()()私に言います。

于 2011-03-10T11:47:13.643 に答える
2

エラーは、通常、少なくとも関数に名前を付けずに関数型を書き出さないことに気付いたときに最もよく理解されますが、関数ポインターではもう少し一般的です。

たとえばint (*fooPtr)()、ポインタに名前を付けます。名前を省略すると、になりますint (*)()。ここで、関数ポインタから関数型に移動すると、が得られますint ()()

ISO C ++はすべてのタイプの正規名を定義しているわけではないため、ここには実際の標準はありません。たとえば、はとconst volatile int同じタイプvolatile const intであり、どちらの形式も正規ではありません。

于 2011-03-10T12:33:06.087 に答える