Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用意外声明为函数的对象后解释GCC错误_C++_Gcc_Most Vexing Parse - Fatal编程技术网

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

C++ 使用意外声明为函数的对象后解释GCC错误,c++,gcc,most-vexing-parse,C++,Gcc,Most Vexing Parse,以下是语言新手常见的拼写错误,他们认为自己在定义一个对象,但实际上在声明一个函数: 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 ()()' compila

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

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()()
?我本以为这只是一个编译器错误。GCC 4.4对我来说是
T()
,而4.2对我来说是
T()

当你意识到你通常不写函数类型而不至少命名函数时,这个错误是最容易理解的,但是对于函数指针来说,它更常见一些

例如,
int(*fooPtr)(
命名指针。如果省略名称,则有
int(*)(
)。现在,从函数指针到函数类型将为您提供
int()()


这里没有真正的标准,因为ISO C++没有为所有类型定义规范名称。例如,

const volatile int
volatile const int
的类型相同,而且两种形式都不是规范的。

Oh,meh。是的,4.4.1也给了我预期的输出。谢谢好的,但是当您为std::function提供一个“函数类型”时,您确实要编写
std::function(…)
。事实上,
int()。但问题是要解释GCC的错误。