使用boost :: optional的正确方法

时间:2015-04-16 04:42:48

标签: c++ boost

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

  1. 变量
  2. 上的解引用运算符
  3. 变量本身
  4. 如果我有这段代码:

    #include <boost/optional.hpp>
    #include <iostream>
    
    int main()
    {
      boost::optional<int> oi;
      std::cout << oi << "\n";
    }
    

    (其中oi未初始化)并使用&#34; g++-4.9 /tmp/optional.cc&#34;进行编译。然后是./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)
    

    这是预期的行为。

2 个答案:

答案 0 :(得分:1)

您必须使用较旧版本的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将打印为--

答案 1 :(得分:0)

boost::optional<T> ostream助手实际上可用,因为提升1.34。见http://www.boost.org/doc/libs/1_34_0/boost/optional/optional_io.hpp

请注意,需要 EXPLICITLY 包含<boost/optional/optional_io.hpp>才能启用这些帮助程序。 <boost/optional.hpp>包含 NOT