7

安全な bool イディオムのすべてのインスタンスを、explicit operator bool既に C++11 機能を使用しているコードで置き換えることを考えています (そのため、古いコンパイラが明示的な変換演算子を認識しないという事実は問題になりません)。微妙な問題を引き起こす可能性がある場合。

したがって、古くて鈍い安全な bool イディオムから新しい光沢のあるイディオムに切り替えることによって引き起こされる可能性のあるすべてexplicit operator boolの非互換性 (最も細かいものであっても) は何ですか?

EDIT: I know that switching is a good idea anyway, for the latter is a language feature, well-understood by the compiler, so it'll work no worse than what's in fact just a hack. I simply want to know the possible differences.

4

2 に答える 2

4

コードで safe-bool 変換を間違って使用した場合にのみ、explicit operator bool互換性がなくなります。それ以外の場合は、問題なく問題ないはずです。実際、問題があっても に切り替える必要がありexplicit operator boolます。これを行うと、safe-bool 変換の使用法で問題を特定できるからです。

この記事によると、一部のコンパイラは、メンバ関数ポインタを使用したセーフブール実装に対して非効率な命令を発行し、

人々がこのイディオムを使い始めたとき、一部のコンパイラで効率が低下していることが判明しました。メンバー関数ポインタがコンパイラの頭痛の種となり、アドレスが取得されるときに実行が遅くなりました。違いはわずかですが、現在の慣例では、通常、メンバー関数ポインターの代わりにメンバー データ ポインターを使用します。

于 2012-02-21T18:52:36.117 に答える
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 */
}
于 2012-02-21T18:56:58.223 に答える