183

@Rのこの答え。Martinho Fernandesは、単純な

explicit operator bool() const;

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

式 e は、何らかの発明された一時変数(§8.5)に対してT、宣言が適切な形式である場合にのみ、暗黙的に型に変換できます。特定の言語構造では、式をブール値に変換する必要があります。そのようなコンテキストに現れる式は、何らかの発明された一時変数 t (§8.5) に対して、宣言が整形式である場合に限り、に文脈的に変換され、整形式であると言われます (§8.5)。T t=e;teboolbool t(e);

強調表示された部分は、@R として "暗黙の明示的なキャスト" (標準では "コンテキスト変換" と呼ばれます) を明確に示しています。マルティニョはそう言った。

「暗黙の明示的なキャスト」を必要とする「特定の言語構造」は次のようです。

  • if, while, for( §6.4 [stmt.select] p4)
  • 二項論理演算子&&and ||(§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)

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

4

2 に答える 2

131

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

于 2011-06-05T12:03:46.730 に答える
-6

私はそれを「時代遅れ」とは呼びません。まだ誰もが C++11 に移行しているわけではありません (まだ1 年も経っていません)。そして、かなりの数のコーダーがいたとしても、コードの下位互換性を維持する機能は必須です。この種のイディオムは、プログラム自体よりもライブラリにとってより賢明であるように思われるからです。

于 2011-12-18T19:32:08.687 に答える