Jakie jest uzasadnienie wdrożenia boost :: none_t?
Boost.Optional używa typu atrapy, aby umożliwić tworzenie niezainicjowanych instancjiboost::optional<T>
. Ten typ jest nazywanynone_t
i przykładnone
jest już zdefiniowany w nagłówku dla wygody, co pozwala nam pisać kod, taki jak poniżej:
boost::optional<int> uninitialized(boost::none);
Patrząc na definicjęnone_t
, Zauważyłem, że w rzeczywistości jest to typedef odpowiadający wskaźnikowi do elementu do jakiejś sztucznej struktury:
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
Jakie są zalety używania tak zwiniętego typedefu w stosunku do prostej pustej struktury takiej jak ta?
namespace boost {
struct none_t {};
none_t const none;
} // namespace boost