【问题标题】:What is the rationale for boost::none_t implementation?boost::none_t 实现的基本原理是什么?
【发布时间】:2012-06-07 15:11:56
【问题描述】:

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

【问题讨论】:

  • 我刚刚意识到(花了我一段时间...)这正是Safe-Bool Idiom 的结构。
  • @MatthieuM.:您的意思是您刚刚阅读了 Nawaz 在 2012 年 6 月在您的回答中发表的评论......? ;)
  • 不,我自己重新发现了它:/早上很困难:/

标签: c++ boost boost-optional


【解决方案1】:

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

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

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

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

编辑:这里应该知道(嗯...)Safe Bool Idiom 的结构。

【讨论】:

  • 啊...boost::none 确实转换为false。 :D
  • 这是有道理的,虽然我真的不明白将none 转换为false 的意义。恕我直言,它只能给人以noneoptional 的错误印象。但也许我忽略了图书馆作者预期的一些极端情况。
  • 反正就是跟在Safe Bool Idiom之后。
  • @LucTouraille:好吧,我想同样的论点可以用于nullptr;由于它们都扮演相同的角色,因此它们在许多情况下的行为相似是有些连贯的。
最近更新 更多