2012-02-21 17 views
7

私は安全なboolイディオムのすべてのインスタンスを、すでにC++ 11の機能を使用しているコードでexplicit operator boolに置き換えることを考えています(古いコンパイラが明示的変換演算子は問題ではありません)ので、微妙な問題が発生する可能性があるかどうかを知りたいと思います。安全なboolイディオムと明示的な演算子boolとの間の互換性がありません

したがって、新しい、ピカピカexplicit operator boolに古いと鈍い安全なブールイディオムからの切り替えが原因で発生することができすべて可能性の非互換性(も、最も微細なもの)は何ですか?

EDIT:後者はコンパイラがよく理解している言語機能であるため、実際にはちょうどハックよりも悪くはありません。私は単に可能性のある違いを知りたいだけです。

答えて

3

コードでセーフ・ブール変換を間違って使用した場合は、間違って間違って行うことはできないため、explicit operator boolは互換性がありません。さもなければ、それは問題なしでちょうどよいべきである。実際に問題があってもexplicit operator boolに切り替える必要があります。その場合、セーフブール変換の使用上の問題を特定できるためです。

this articleによると、いくつかのコンパイラは、人々がこのイディオムを使用し始めたとき、それはいくつかのコンパイラでの効率の低下があったことが発見された、メンバ関数ポインタを使用して、安全・ブール実装のための非効率的な指示を発する

- メンバ関数ポインタによってコンパイラの頭痛が発生し、アドレスがフェッチされたときに実行が遅くなりました。違いはわずかですが、現在のプラクティスでは、通常、メンバ関数ポインタの代わりにメンバデータポインタを使用します。

+0

もちろん、あなたは正しいです。しかし、私はこれを '言語弁護士 'とタグ付けした理由があります。私は良い事実に関するアドバイスではなく、標準自体から続く純粋な事実をご希望します。とにかく、それを明らかにするが、ありがとう。 – Fanael

+0

@Fanael:スタンダード、C++ 03とC++ 11の両方は、セーフ・ブールのイディオムについて話していないので、私が言ったことをサポートするためにそれを引用することはできません。私が暗示していることは、C++ 11が理由のために '明示的な演算子bool'を導入したことです。その理由の1つは'明示的な演算子bool'がいわゆる安全なブールのイディオム。 – Nawaz

+1

しかし、標準では、セーフ・ブールのイディオムを実装するために使用されたことについて話しています。標準ではそのイディオムそのものについては言及していませんが、その正確な保証はドキュメントによってかなり暗示されています。 – Fanael

4

おそらく最大の違いは、(安全な仮定、私は知らない)あなたのコードにバグが自由であると仮定すると、いくつかのケースでは、あなたは正確にboolへの暗黙的な変換をすることができていることになります。 explicit変換関数は一致しません。

struct S1 
{ 
    operator S1*() { return 0; } /* I know, not the best possible type */ 
} s1; 

struct S2 
{ 
    explicit operator bool() { return false; } 
} s2; 

void f() 
{ 
    bool b1 = s1; /* okay */ 
    bool b2 = s2; /* not okay */ 
} 
+2

これは安全なブールのイディオムではありません。 – Nawaz

+4

私は既に使用しているポインタの型が最良の型ではないことに注意しましたが、これと正しい実装の違いは私の答えとは無関係であり、より読みやすくなっています。 – hvd

関連する問題