我们有以下代码
int main()
{
void f() throw(int);
f();
return 0;
}
void f() { }
GCC和clang汇编得很好。但是,在标准中有这样的段落:
n3376 15.4 / 4如果函数的任何声明具有异常规范,那么它不是noexcept规范允许的 所有异常,该函数的所有声明(包括定义和任何显式特化)都应具有兼容的异常规范。
以下示例:gcc - error,clang - warning
void f() throw(int);
int main()
{
f();
return 0;
}
void f() { }
为什么这些片段有所不同?感谢。
答案 0 :(得分:2)
来自std规范的n3376 15.4 / 4,函数的所有声明和定义必须具有相同的投掷类型。在这里:
void f() throw(int);
int main()
{
f();
return 0;
}
void f() { }
声明void f() throw(int);
和定义void f() { }
在全球范围内。因此它们存在冲突,因为声明是针对一个函数,它抛出int而定义是针对没有throw规范的函数。
现在,当你把声明放在主scop中时,定义不在同一个scop中,在这个scop期间定义是未知的,所以你可以编译。
我希望你理解我的英语,抱歉。