我们有以下代码异常规格不兼容的声明和实现的功能
int main()
{
void f() throw(int);
f();
return 0;
}
void f() { }
GCC和铛编译得很好。但是,在标准有这样一段话:
n3376 15.4/4
如果任何声明函数有一个异常规范不是一个noexcept规格允许 所有的异常,所有声明,包括该功能的定义和任何明确的专业化应具有兼容的异常规范。
而对于下面的例子:GCC - 错误,铛 - 警告
void f() throw(int);
int main()
{
f();
return 0;
}
void f() { }
为什么有这些片断的区别?谢谢。
在另一个函数内部声明的函数是否指向外部同名函数的定义?在另一个中声明一个函数是什么意思? – jogojapan 2013-02-19 05:39:56
@jogojapan,无法找到关于这种情况的标准。但无论如何,这里没有未定义的参考。 http://liveworkspace.org/code/3BA8in$0有undef ref。 – ForEveR 2013-02-19 05:41:17
是的,但问题(即使它是一个编译器问题)与此相关,与异常规范的处理无关。例如,如果你声明'f'在'main'内部返回'int',但是在'main'之外返回'void',它仍然会被编译。即使你调用'f'并使用其所谓的返回值。至少在g ++和clang中:http://liveworkspace.org/code/2l5YiJ$1有趣的是,英特尔编译器发出警告。 – jogojapan 2013-02-19 05:45:05