以下代码使用g ++ 4.8.1成功编译:
int main()
{
int(*)();
}
Run Code Online (Sandbox Code Playgroud)
它看起来像一个函数指针的简单声明:
int(*f)();
Run Code Online (Sandbox Code Playgroud)
它不能用clang 3.4和vc ++ 2013编译.
它是编译器错误还是标准的黑暗之处?
int(*)();
int(*);
int(*){};
int(*());
更新1: @Ali在评论中添加了一些有趣的信息:
所有4个案例都使用clang 3.5 trunk(202594)进行编译错误,并使用gcc 4.9 trunk(20140302)进行编译.行为是一样的
-std=c++98 -pedantic,除了int(*){};可以理解的; 扩展初始化程序列表仅适用于-std=c++11.
更新2:正如@CantChooseUsernames在他的回答中指出的那样,即使没有任何启用的优化,即使初始化它们仍然可以正常编译并且没有为它们生成汇编(无论是否初始化):
int(*)() = 0;
int(*) = 0;
int(*){} = 0;
int(*()) = 0;
更新3:我真的很惊讶地发现int(*)() = "Hello, world!";编译也很好(int(*p)() = "Hello, world!";当然不会编译).
更新4:太棒了但int(*){} = Hello, world!;编译得很好.而下面的怪异之极的一段代码,也:int(*){}() …
以下代码编译得很好,我不知道为什么.有人可以向我解释为什么这是合法的吗?
我正在使用g ++(Debian 6.1.1-10)6.1.1 20160724进行编译.
#include <iostream>
int sum(int x, int y) { return x + y; }
int main(int argc, char *argv[])
{
using std::cout;
int (*) (int, int) = ∑
cout << "what" << '\n';
}
Run Code Online (Sandbox Code Playgroud)
附录
以下程序使用g ++版本5.4.0进行编译,但无法在gcc中编译.
int main()
{
int (*) = 20;
}
Run Code Online (Sandbox Code Playgroud)