【发布时间】:2017-05-08 15:53:55
【问题描述】:
在 C++17 中noexcepthas been added to the type system:
void r1( void (*f)() noexcept ) { f(); }
void foo() { throw 1; }
int main()
{
r1(foo);
}
最新版本的C++17模式的GCC和Clang拒绝调用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);
}
Clang 接受程序,显然忽略了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 的正确行为。你能把评论写成答案吗?
-
即使在 C++14 中,您的第一个 sn-p 也是无效的:timsong-cpp.github.io/cppwp/n4140/except.spec#5
标签: c++ function c++17 noexcept