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

啊,我从没想过要深入挖掘。

常规 的一个(或多或少明显的)优势struct是现在在布尔上下文中none评估为。false

与另一个“评估为假”相比的一个优点是可以防止指向成员的指针有害地提升为整数类型。

所以,我想它提供了一种安全而简洁的方法来获得一个评估为false.

编辑:人们应该在这里认识到(嗯......)Safe Bool Idiom的结构。

于 2012-06-07T15:20:52.017 回答