2016-12-22 31 views
15

在C++ 17 noexcepthas been added to the type system与noexcept功能:的std ::在C++ 17

void r1(void (*f)() noexcept) { f(); } 
void foo() { throw 1; } 

int main() 
{ 
    r1(foo); 
} 

GCC的最新版本,并在铛C++ 17模式拒绝呼叫r1(foo)因为void (*)()不能隐含转换为void (*)() noexcept

但随着std::function代替:

#include <functional> 

void r2(std::function<void() noexcept> f) { f(); } 
void foo() { throw 1; } 

int main() 
{ 
    r2(foo); 
} 

铛接受程序,显然忽略noexcept说明符;而g ++给出了一个关于std::function<void() noexcept>的奇怪错误。

在C++ 17中,第二个程序的正确行为是什么?

+0

如果noexcept现在被认为是该类型的一部分,那么void()noexcept与void()不同,因此这是不合格的。与Java不同,不包括异常说明作为函数签名的一部分,这是我一直认为C++出错的原因。很高兴看到这现在正在纠正。 –

+3

行为是它应该抱怨不完整的类型。 'std :: function'仅部分专用于'R(Args ...)',而不是'R(Args ...)noexcept'。 –

+0

@ T.C。好的,然后通过g ++ 7修正行为。你能把这个评论写入一个答案吗? –

回答

11

std::function的定义在当前的工作草案没有改变:

template<class T> 
class function; // not defined 

template<class R, class... ArgTypes> 
class function<R(ArgTypes...)> { 
    /* ... */ 
}; 

由于void() noexcept不匹配部分特,std::function<void() noexcept>是一个不完整的类型。 Clang和GCC干线都相应地诊断出这种情况。