簡體   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