使用意外声明为函数的对象后,解释GCC错误

Lig*_*ica 2 c++ gcc most-vexing-parse

以下是语言新手的常见拼写错误,他们认为他们正在定义一个对象,但实际上是在声明一个函数:

struct T
{
   void foo() {}
};

int main()
{
   T obj();
   obj.foo();
}
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

为什么消息中报告的类型T ()()?我曾经期待过T ().

eta*_*ion 5

IIRC这只是一个编译器错误.GCC 4.4说T()4.2而4.2 T()().