正确的使用方法 boost::optional

Right way to use boost::optional

我看到两种访问 boost::optional 变量的方法:

  1. 变量的取消引用运算符
  2. 变量本身

如果我有这个代码片段:

#include <boost/optional.hpp>
#include <iostream>

int main()
{
  boost::optional<int> oi;
  std::cout << oi << "\n";
}

(其中 oi 未初始化)并使用“g++-4.9 /tmp/optional.cc”编译它,然后是 ./a.out,我得到 0,

但是有了这个:

#include <boost/optional.hpp>
#include <iostream>

int main()
{
  boost::optional<int> oi;
  std::cout << *oi << "\n";
}

我得到:

a.out: /usr/include/boost/optional/optional.hpp:631: boost::optional<T>::reference_type boost::optional<T>::get() [with T = int; boost::optional<T>::reference_type = int&]: Assertion `this->is_initialized()' failed.
Aborted (core dumped)

这是预期的行为。

您一定一直在使用旧版本的 Boost。您的第一个案例触发了转换为 bool;由于 optional 不包含值,因此转换结果为 false,打印为 0

较新的版本 (1.56-1.57) 添加了一个 operator<< 函数模板声明到 <boost/optional.hpp>

template<class CharType, class CharTrait, class T>
std::basic_ostream<CharType, CharTrait>&
operator<<(std::basic_ostream<CharType, CharTrait>& out, optional<T> const& v);

捕获此类错误并导致链接器错误。

请注意,包含 <boost/optional/optional_io.hpp> 允许您实际使用带有 optional 的流运算符,在这种情况下,不包含值的 optional 将打印为 --.

boost::optional<T> ostream 助手自 boost 1.34 以来实际上可用。参见 http://www.boost.org/doc/libs/1_34_0/boost/optional/optional_io.hpp

请注意,需要 EXPLICITLY 包含 <boost/optional/optional_io.hpp> 才能启用这些助手。它 NOT 包含在 <boost/optional.hpp> 中。