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
答案 0 :(得分:17)
常规struct
的一个(或多或少明显)优势是,现在none
在布尔上下文中求值为false
。
优于另一个“评估为假”的一个优点是,可以防止指向成员的指针对整数类型的有害促销。
所以,我想它提供了一种安全,简洁的方法,可以将对象评估为false
。
编辑:人们应该在这里认识(哼......)Safe Bool Idiom的结构。