[英]noexcept operator compile-time check
在下面的代码中,我试图对函数使用条件异常规范,但编译失败,尽管如果在 function 之外使用它就可以了。
void may_throw();
// ERROR: expression must have bool type or be convertible to bool
void check () noexcept(may_throw());
int main()
{
// works just fine!
std::cout << noexcept(may_throw());
}
问题是如何检查 function 是否抛出而不改变 function 原型有条件地指定noexcept
?
我无法更改 function 原型,因为关键是检查 function 是否应该返回真或假。
编辑
我试图取笑noexcept
但它看起来不适用于宏。
#include <iostream>
#if 0
#define ASDF(...) (void)0
#else
#define ASDF(...) throw 1
#endif
void check() noexcept(noexcept(ASDF()))
{
// wrong!
// std::cout << noexcept(noexcept(ASDF()));
// edit: it should be this, and it works.
// (tnx: StoryTeller-UnslanderMonica)
std::cout << noexcept(ASDF());
ASDF(0);
}
int main()
{
check();
}
给定void check () noexcept(may_throw());
, noexcept 说明符需要一个可转换为bool
的表达式,而may_throw()
返回void
并且不能转换为bool
。
您应该在may_throw()
上应用noexcept 运算符并将其指定为 noexcept 说明符。 IE
// whether check is declared noexcept depends on if the expression
// may_throw() will throw any exceptions
void check () noexcept(noexcept(may_throw()));
// ^^^^^^^^ -> specifies whether check could throw exceptions
// ^^^^^^^^ -> performs a compile-time check that returns true if may_throw() is declared to not throw any exceptions, and false if not.
正确的做法是:
noexcept( noexcept( may_throw() ) )
至于为什么,第一个noexcept
被定义为noexcept-specifier
。 这用于判断noexcept
是否为 noexcept。 它具有以下形式(来自[except.spec]
):
noexcept-specifier:
noexcept ( constant-expression )
noexcept
throw ( )
第二个是noexcept-operator
: noexcept 操作符确定对其操作数的求值,它是一个未求值的操作数 (8.2),是否可以抛出异常 (18.1)。 来自[expr.unary.noexcept]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.