25

Boost.Optionalは、ダミータイプを使用して、の初期化されていないインスタンスを構築できるようにしますboost::optional<T>。このタイプはと呼ばれnone_t、インスタンスnoneは便宜上ヘッダーにすでに定義されているため、次のようなコードを記述できます。

boost::optional<int> uninitialized(boost::none);

の定義を見るとnone_t、実際には、ダミー構造体へのメンバーへのポインターに対応するtypedefであることがわかりました。

namespace boost {

namespace detail { struct none_helper{}; }

typedef int detail::none_helper::*none_t ;

none_t const none = (static_cast<none_t>(0)) ;

} // namespace boost

このような単純な空の構造体に対して、このような複雑なtypedefを使用する利点は何ですか?

namespace boost {

struct none_t {};

none_t const none;

} // namespace boost
4

1 に答える 1

17

ああ、もっと深く掘り下げるとは思ってもみませんでした。

通常の(多かれ少なかれ明らかな)利点の1つstructは、ブールコンテキストでnone評価されることです。false

別の「falseと評価される」に対する1つの利点は、メンバーへのポインターが整数型への有害な昇格を防ぐことです。

だから、私はそれがに評価されるオブジェクトを持つための安全で簡潔な方法を提供すると思いますfalse

編集:ここで(ハム...)SafeBoolIdiomの構造を認識する必要があります

于 2012-06-07T15:20:52.017 に答える