15
在C++ 17 noexcept
has 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中,第二个程序的正确行为是什么?
如果noexcept现在被认为是该类型的一部分,那么void()noexcept与void()不同,因此这是不合格的。与Java不同,不包括异常说明作为函数签名的一部分,这是我一直认为C++出错的原因。很高兴看到这现在正在纠正。 –
行为是它应该抱怨不完整的类型。 'std :: function'仅部分专用于'R(Args ...)',而不是'R(Args ...)noexcept'。 –
@ T.C。好的,然后通过g ++ 7修正行为。你能把这个评论写入一个答案吗? –