c++ - boost::none_t 实现的基本原理是什么?

标签 c++ boost boost-optional

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/

相关文章:

c++ - 确定二维数组的唯一行 (vector<vector<T>>)

c++ - 如何在不添加对 bjam 的依赖的情况下将 boost::filesystem 包含到 VS2010 项目中?

c++ - How to get around GCC ‘*((void*)& b +4)’ may be used uninitialized in this function warning while using boost::optional

c++ - Boost 可选,带有 Boost Thread 编译问题

c++ - 打开元组可变参数模板参数的包装

c++ - 如果任何注释附加到键值,Boost 属性树 ini 解析会出错

c++ - const char& 作为函数的参数

c++ - 如何在一个屏幕中使用两个缓冲区?是否可以 ? (快板.h)

c++ - 编译时结合 fno-rtti lib 和 rtti lib?