[英]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.