以下代码使用g ++ 4.8.1成功编译:
int main()
{
int(*)();
}
它看起来像一个简单的函数指针声明:
int(*f)();
它不能与clang 3.4和vc ++ 2013一起编译。
是编译器错误还是标准的暗处之一?
使用g ++ 4.8.1可以正常编译的类似奇怪代码片段的列表(已更新):
int(*)();
int(*);
int(*){};
int(*());
更新1: @Ali在注释中添加了一些有趣的信息:
所有4种情况均使用clang 3.5干线(202594)给出了编译错误,并且使用gcc 4.9干线(20140302)进行了编译。的行为与相同
-std=c++98 -pedantic
,但int(*){};
可以理解的除外。扩展的初始化程序列表仅适用于-std=c++11
。
更新2:正如@CantChooseUsernames在他的回答中指出的那样,即使没有初始化,它们仍然可以正常编译,即使没有启用任何优化,g ++也不会为它们生成任何汇编(既没有初始化也没有初始化):
int(*)() = 0;
int(*) = 0;
int(*){} = 0;
int(*()) = 0;
更新3:令我惊讶的是int(*)() = "Hello, world!";
,它也int(*p)() = "Hello, world!";
可以很好地编译(当然不编译)。
更新4:很棒,但是可以int(*){} = Hello, world!;
编译。而下面的怪异之极的一段代码,也:int(*){}() = -+*/%&|^~.,:!?$()[]{};
(活生生的例子)。
这个错误和许多相关的语法问题正在作为gcc错误68265进行跟踪。
int(*)();
就像键入int;
或int*;
...。也就是说,您开始声明变量类型,但不要命名它。