@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として明確に示しています。マルティーニョが言った。
「暗黙の明示的キャスト」を必要とする「特定の言語構成体」は、次のように見えます。
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
)
タイトルの仮定は正しいですか?潜在的な欠点を見落としていないことを願っています。
30
+1:次の基準について新しいことを教えてくれるこのタイプの質問が大好きです。
—
ビョルンPollex
暗黙の明示的なキャストが標準に欠けていることを知っています...別のものから何かを返します
—
デヴィッド・
operator bool
。たとえば、shared_ptr
p というメンバーがあり、このメソッドoperator bool() const { return p; }
がある場合、はコンパイルに失敗します。それは愚かなIMOです。
「暗黙の明示的」キャスト、@ Davidとはどういう意味ですか?
—
Sz。