比较 (<)、输出 (<<) 和赋值 (=) 用于提升::可选

Comparison (<), output (<<) and assignment (=) for boost::optional

本文关键字:lt 可选 用于 输出 比较 赋值      更新时间:2023-10-16

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

boost::optional<int> i;
  1. i < 3是否总是等价于*i < 3(对于其他关系运算符也是类似的)
  2. 条件i < 3*i < 3未定义是否正确?(i仍未设置为任何值)
  3. std::cout << i应该打印什么
  4. 我确信i = 3*i = 3总是一样的。如果是,我应该更喜欢哪一个
  1. 没有。如果i未初始化,则第一个将返回true,而第二个将断言
  2. 没有。operator<的文档清楚地表明,如果左侧参数未初始化,则在设置右侧操作数时,它将返回true
  3. optional没有operator<<,所以我假设它将返回unspecified-bool-type转换并打印1或0(真/假)
  4. 它们不一样。如果i未初始化,则后者将断言,而前者将初始化并分配。您应该使用一个指示您想要的语义的

关于点3,有一个运算符<lt;对于boost/option/optional_io.hpp中声明的boost::optional,但您可能没有包括它。(如果你碰巧使用boost property_tree,它会为你包含在内。)如果包含在内,一个空的可选项将流式传输为"--",而一个填充的可选项则会流式传输一个额外的空格字符,然后流式传输值。

所以这个代码:

#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 = '--'

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

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

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