【问题标题】:Comparison (<), output (<<) and assignment (=) for boost::optionalboost::optional 的比较 (<)、输出 (<<) 和赋值 (=)
【发布时间】:2013-06-29 23:10:36
【问题描述】:

我有几个关于boost::optional 工作原理的问题。让我们先这样做:

boost::optional<int> i;
  1. i &lt; 3 是否总是等同于 *i &lt; 3(其他关系运算符也类似)?
  2. 条件i &lt; 3*i &lt; 3 未定义是否正确? (i 仍未设置任何内容)
  3. std::cout &lt;&lt; i 应该打印什么?
  4. 我很确定i = 3 始终与*i = 3 相同。如果是这样,我应该更喜欢哪个?

【问题讨论】:

  • i.get() 是你的兄弟。
  • boost 是否在最新版本中放弃了其文档?

标签: c++ boost boost-optional


【解决方案1】:
  1. 没有。如果 i 未初始化,则第一个将返回 true,而第二个将断言。
  2. 没有。 operator&lt; 的文档清楚地表明,如果左侧参数未初始化,它将在设置右侧操作数时返回 true
  3. optional 没有 operator&lt;&lt;,所以我假设它会返回 unspecified-bool-type 转换并打印 1 或 0(真/假)。
  4. 它们不一样。如果i 未初始化,则后者将断言,而前者将初始化并分配。您应该使用能表明您想要的语义的那个。

【讨论】:

    【解决方案2】:

    关于第 3 点,在 boost/optional/optional_io.hpp 中为 boost::optional 声明了 运算符

    所以这段代码:

    #include <boost/optional/optional_io.hpp>
    boost::optional<string> var1 = "value";
    boost::optional<string> var2;
    cout << " var1 = '" << var1 << "'\n";
    cout << "*var1 = '" << *var1 << "'\n";
    cout << " var2 = '" << var2 << "'\n";
    

    产生这个:

     var1 = ' value'
    *var1 = 'value'
     var2 = '--'
    

    但没有包含的相同代码会产生这种情况,正如 Mark B 的回答所建议的那样:

     var1 = '1'
    *var1 = 'value'
     var2 = '0'
    

    第一种情况下的额外空间让我有些困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 2018-04-13
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2012-08-18
      相关资源
      最近更新 更多