0

ファイルboost/smart_ptr/detail/operator_bool.hppをフォローしていると、理解できない次のコード スニペットに出くわしました。

typedef T * this_type::*unspecified_bool_type;

operator unspecified_bool_type() const // never throws
{
    return px == 0? 0: &this_type::px;
}

XCode でいくつかのテスト コードを書き、&this_type::px常に 1 を返します。なぜですか?

C++ の第一人者があなたの考えを共有できますか?

4

3 に答える 3

3

これは、 Safe Bool Idiomとして知られるちょっとしたトリックです。

bool問題は、変換演算子を次のように記述する場合です。

operator bool() const;

次に、たとえば、次のようなトリッキーな状況で使用1 + sharedpできboolますint

したがって、トリックは、変換できるがbool、他のすべての操作がコンパイル中にエラーを引き起こす型を使用することです。推奨される方法は、クラスでメンバーへのポインターを使用することtypedefです。エラー メッセージがもう少し理解しやすいように、明示的な名前に編集されます。


C++11 では、explicit修飾子を変換演算子に適用できるため、このトリックは廃止されました。

explicit operator bool() const { return px; }

ずっと楽しいですね。

于 2012-06-07T08:33:22.813 に答える
1

&this_type::pxに相当するブール値を取得するために使用されるトリックtrueです。

boost はbool型を使用せず、代わりにそれが何であるかを指定しないため、常にtrue既存のメンバーの同等の表現を返すメンバーへのポインター キャストを使用します (つまり、 notnullptrまたは からキャストされたもの0)。

4.12 を参照してください。

算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。

C++ では、ポインターからメンバーへの整数へのキャストがないため、ポインターからメンバーへのブール変換は常に整数コンテキストで発生します。

于 2012-06-07T08:33:21.623 に答える
1

これは 1 ではありませんが、boolalpha フラグをオンにしていない場合、ostream によって 1 (bool) として出力されます。ostream には、メンバー ポインター用の特別な出力演算子はありません。

于 2012-06-07T09:47:44.557 に答える