1. ホーム
  2. c++

[解決済み] C++11でsafe-boolイディオムは廃止されますか?

2022-04-20 18:37:56

質問

この回答は@R. Martinho Fernandes さん は、C++11 で safe-bool イディオムが明らかに非推奨であり、単純な

explicit operator bool() const;

回答にある標準的な引用文によると §4 [conv] p3 :

<ブロッククオート

式eは暗黙のうちに型に変換されることがあります。 T という宣言がある場合のみ T t=e; は整形式で、ある発明された一時的な変数に対して t (§8.5). ある種の言語構成は、式をブール値に変換することを必要とします。ある式 e このような文脈で現れるものは、次のように言われます。 文脈変換 から bool が整形式であるのは、この宣言がある場合のみです。 bool t(e); は整形式である は、ある発明された一時変数t(8.5節)について。

ハイライトされた部分は、@R. のように、暗黙の明示的キャスト(規格では文脈依存変換)を明確に示しています。Martinho が言っているように、暗黙の明示的キャスト(規格では "コンテキスト変換" と呼ばれています。

暗黙の明示的キャスト(implicit explicit cast")を必要とする特定の言語構成(")は、次のようなものだと思われます。

  • if , while , for ( §6.4 [stmt.select] p4 )
  • 二項論理演算子 &&|| ( §5.14 [expr.log.and/or] p1 の両方があります)
  • 論理否定演算子 ! ( §5.3.1 [expr.unary.op] p9 )
  • 条件演算子 ?: ( §5.14 [expr.cond] p1 )
  • static_assert ( §7 [dcl.dcl] p4 )
  • noexcept ( §15.4 [except.spec] p2 )

タイトルの想定は正しいでしょうか?潜在的な欠点を見落としていなければいいのですが。

解決方法は?

はい、これは その 暗黙的なユーザー定義変換しか持たず、明示的なユーザー定義変換演算子を実質的に持たなかった場合の問題の例 この問題のために発明された そして、すべての安全なブールを、よりクリーンで論理的なものに置き換えるために。