提升::none_t实施的基本原理是什么

What is the rationale for boost::none_t implementation?

本文关键字:是什么 none 提升      更新时间:2023-10-16

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

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

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

与另一个"计算为 false"相比,一个优点是防止指向成员的指针有害地提升为整型。

所以,我想它提供了一种安全简洁的方式来拥有一个评估为 false 的对象。

编辑:人们应该在这里认识到(哼哼...)安全布尔习语的结构。