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


179

@Rのこの答え。Martinho Fernandesは、セーフブールイディオムは単純にC ++ 11で置き換えられるため、C ++ 11では廃止されることを示しています。

explicit operator bool() const;

答えの標準的な見積もりによると§4 [conv] p3

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

強調表示された部分は、「暗黙の明示的キャスト」(標準では「コンテキスト変換」と呼ばれます)を@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

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


30
+1:次の基準について新しいことを教えてくれるこのタイプの質問が大好きです。
ビョルンPollex

1
暗黙の明示的なキャストが標準に欠けていることを知っています...別のものから何かを返しますoperator bool。たとえば、shared_ptrp というメンバーがあり、このメソッドoperator bool() const { return p; }がある場合、はコンパイルに失敗します。それは愚かなIMOです。
デヴィッド・

「暗黙の明示的」キャスト、@ Davidとはどういう意味ですか?
Sz。

回答:


128

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


-5

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


34
私はC ++ 11の存在下で純粋に話していました。この質問は、古いコード、後方互換性、またはC ++ 11対応のコンパイラに変更したくないということに触れません。また、C ++ 11自体は完全に下位互換性がないため、重大な変更が導入されています。
Xeo

4
それを知ることができなかっただろう、すみません。私は最初にリンクされた回答だけでなく、質問に[c ++]と[c ++-faq]のタグが付いているという事実も考慮しなかったので、言語の両方の段階の評価が関連していると思いました。
Luis Machuca、2011

1
確かにあなたは正しいです、私は質問でそれを明示的に述べませんでした。頭を上げてくれてありがとう。
Xeo

1
この回答は2年近く経過しているため、実際には更新を使用できます。
パピー

1
自分でビールを買って「つらい気持ちだ」と言っても、意見の不一致のために反対票を投じるつもりです。しかし、C ++ 11の多くのパラダイムで--std=c++0xは、最終的な釘が標準棺桶に打ち込まれるずっと前から配備が行われており、ISO仕様に名前を付けることにしました。あなたが本当に深いテンプレートメタプログラミング中毒者でない限り、C ++ 11仕様の詳細と人々が使用していたものの詳細はあなたに何の影響もないでしょう...それはそれでもほとんどすべての実用的な目的のために2011よりも古いことを意味します。そして今、私の時計で、それはほぼ2015年だ
HostileForkがdont信頼SE言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.