2013-02-19 70 views
6

我们有以下代码异常规格不兼容的声明和实现的功能

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() { } 

为什么有这些片断的区别?谢谢。

+0

在另一个函数内部声明的函数是否指向外部同名函数的定义?在另一个中声明一个函数是什么意思? – jogojapan 2013-02-19 05:39:56

+0

@jogojapan,无法找到关于这种情况的标准。但无论如何,这里没有未定义的参考。 http://liveworkspace.org/code/3BA8in$0有undef ref。 – ForEveR 2013-02-19 05:41:17

+4

是的,但问题(即使它是一个编译器问题)与此相关,与异常规范的处理无关。例如,如果你声明'f'在'main'内部返回'int',但是在'main'之外返回'void',它仍然会被编译。即使你调用'f'并使用其所谓的返回值。至少在g ++和clang中:http://liveworkspace.org/code/2l5YiJ$1有趣的是,英特尔编译器发出警告。 – jogojapan 2013-02-19 05:45:05

回答

2

从一个函数的所有声明和定义必须具有相同的投掷类型在std specifie的n3376 15.4/4。在这里:

void f() throw(int); 
int main() 
{ 
    f(); 
    return 0; 
} 

void f() { } 

声明void f() throw(int);和定义void f() { }在全球SCOP。所以它们是冲突的,因为声明是针对抛出int的函数,而定义针对没有抛出规范的函数。

现在,当你把声明的主要SCOP的定义是不一样SCOP,在这个SCOP的定义是不知道,所以你可以编译。

我希望你能理解我的英语,对此表示遗憾。

+0

不是真的,但接受。 Actualy铛现在处理这种情况,但只有警告:http://melpon.org/wandbox/permlink/z6JcuiyJm7y87PXD – ForEveR 2015-09-05 07:54:04