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