繁体   English   中英

noexcept 运算符编译时检查

[英]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-operatornoexcept 操作符确定对其操作数的求值,它是一个未求值的操作数 (8.2),是否可以抛出异常 (18.1)。 来自[expr.unary.noexcept]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM