web-dev-qa-db-ja.com

safe-boolイディオムはC ++ 11では廃止されていますか?

@ R。Martinho Fernandesのこの回答 は、セーフブールイディオムがC++ 11で非推奨になっていることを示しています。

_explicit operator bool() const;
_

回答_§4 [conv] p3_の標準引用によると:

いくつかの発明された一時変数T(§8.5)について、宣言_T t=e;_が整形式の場合にのみ、式eは暗黙的にt型に変換できます。特定の言語構造では、式をブール値に変換する必要があります。このようなコンテキストに現れる式eは、コンテキストに応じてからboolおよびは、宣言bool t(e);が整形式の場合にのみ、整形式の一時変数t(§8.5)に対して整形式です。

ハイライトされた部分は、「暗黙の明示的キャスト」(標準では「コンテキスト変換」と呼ばれます)を@Rとして明確に示しています。マルティーニョは言った。

「暗黙の明示的キャスト」を必要とする「特定の言語構成体」は、次のように思われます。

  • ifwhilefor(_§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_)

タイトルの私たちの仮定は正しいですか?潜在的な欠点を見逃していないことを願っています。

172
Xeo

はい。これはtheの例です。暗黙的なユーザー定義の変換と明示的なユーザー定義の変換演算子のみが実際にあった問題の例です この問題のために発明されました そして、すべての安全なものをよりクリーンで論理的なものに置き換えます。

123
Puppy