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

Luc*_*lle 24 c++ boost boost-optional

Boost.Optional使用虚拟类型来允许构建未初始化的实例boost::optional<T>.调用此类型none_t,none为方便起见,已在头中定义了一个实例,允许我们编写如下代码:

boost::optional<int> uninitialized(boost::none);
Run Code Online (Sandbox Code Playgroud)

看一下定义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
Run Code Online (Sandbox Code Playgroud)

使用这样一个复杂的typedef比这样的简单空结构有什么好处?

namespace boost {

struct none_t {};

none_t const none;

} // namespace boost
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 17

啊,我从未想过要深入挖掘.

常规的一个(或多或少显而易见的)优点struct是现在在布尔上下文中none求false值.

相对于另一个"评估为假"的一个优点是,防止指向成员的指针对整体类型的有害促销.

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

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

  • 无论如何,换句话说,它只是[Safe Bool Idiom](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool). (2认同)