给定以下完整程序:
#include <functional>
struct jobbie
{
std::function<void()> a;
};
void do_jobbie(jobbie j = {})
{
if (j.a)
j.a();
}
int main()
{
do_jobbie();
return 0;
}
在 gcc (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1 上编译这个:boom!
richard@DEV1:~/tmp$ g++ -std=c++11 bug.cpp
bug.cpp: In function ‘int main()’:
bug.cpp:16:13: internal compiler error: in create_tmp_var, at gimplify.c:479
do_jobbie();
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.8/README.Bugs> for instructions.
Preprocessed source stored into /tmp/ccWGpb7M.out file, please attach this to your bugreport.
然而,clang [Apple LLVM 版本 5.1 (clang-503.0.40) (基于 LLVM 3.4svn)] 对此很满意。
$ clang++ -std=c++11 bug.cpp
在我看来,clang 正确地推断出 j 默认为默认构造的jobbie
对象,而 gcc (显然)正在爆炸。
将第 8 行替换为void do_jobbie(jobbie j = jobbie {})
修复 gcc 上的问题。
问题 - 以下哪些是正确的:
- clang 是正确的,gcc 是错误的(忽略编译器爆炸)
- clang 超出了标准,它不应该真正编译
- 标准没有说清楚?