Search code examples
c++gccmost-vexing-parse

Explain GCC error after using an object accidentally declared as a function


The following is a common typo with language newcomers, who think that they are defining an object but are actually declaring a function:

struct T
{
   void foo() {}
};

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

GCC 4.1.2's error is:

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.

Why is the reported type in the message T ()()? I'd have expected T ().


Solution

  • IIRC this is just a compiler bug. GCC 4.4 says T() while 4.2 says T()() for me.