Boost.Optional使用虚拟类型来允许构造 boost::optional<T>
的未初始化实例.这种类型称为 none_t
, 和一个实例 none
为方便起见,已在 header 中定义,允许我们编写如下代码:
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
最佳答案
啊,我从没想过要深入挖掘。
常规 struct
的一个(或多或少明显的)优点是,现在 none
在 bool 上下文中计算为 false
。
与另一个“评估为假”相比的一个优点是可以防止指向成员的指针有害地 boost 为整数类型。
所以,我想它提供了一种安全而简洁的方法来获得一个评估为 false
的对象。
编辑:这里应该知道(嗯...)Safe Bool Idiom 的结构。 .
关于c++ - boost::none_t 实现的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10934626/