For*_*veR 6 c++ g++ c++11 clang++
我们有以下代码
int main()
{
void f() throw(int);
f();
return 0;
}
void f() { }
Run Code Online (Sandbox Code Playgroud)
GCC和clang汇编得很好.但是,在标准中有这样的段落:
n3376 15.4/4
如果函数的任何声明具有异常规范,该规范不是允许所有异常的noexcept 规范,则该函数的所有声明(包括定义和任何显式特化)都应具有兼容的异常规范.
以下示例:gcc - 错误,clang - 警告
void f() throw(int);
int main()
{
f();
return 0;
}
void f() { }
Run Code Online (Sandbox Code Playgroud)
为什么这些片段有区别?谢谢.
小智 3
std 中的 n3376 15.4/4 指定函数的所有 d\xc3\xa9 声明和定义必须具有相同的抛出类型。这里 :
\n\nvoid f() throw(int);\nint main()\n{\n f();\n return 0;\n}\n\nvoid f() { }\n
Run Code Online (Sandbox Code Playgroud)\n\n声明void f() throw(int);
和定义void f() { }
都在全局范围内。所以它们是冲突的,因为声明是针对抛出 int 的函数,而定义是针对没有 throw 规范的函数。
现在,当您将声明放在主范围中时,定义不在同一范围中,在此范围内定义未知,因此您可以编译。
\n\n我希望你能理解我的英语,抱歉。
\n 归档时间: |
|
查看次数: |
1887 次 |
最近记录: |