boost :: optional的比较(<),输出(<<)和赋值(=)

时间:2013-06-29 23:10:37

标签: c++ boost boost-optional

我有一些关于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相同。如果是这样,我应该选择哪一个?

2 个答案:

答案 0 :(得分:9)

  1. 否。如果i未初始化,则第一个将返回true,而第二个将断言。
  2. 否。 operator<的文档清楚地表明,如果左手参数未初始化,则在设置右手操作数时将返回true
  3. operator<<没有optional所以我认为它会返回unspecified-bool-type转换并打印1或0(真/假)。
  4. 他们不一样。如果i未初始化,则后者将断言,而前者将初始化并分配。你应该用一个表示你想要的语义的那个。

答案 1 :(得分:4)

关于第3点,运算符&lt;&lt;对于boost :: optional / optional_io.hpp中声明的boost :: optional,但你可能不包含它。 (如果您碰巧使用了boost property_tree,它会被包含在内。)如果包含它,则一个空的可选项将作为&#34; - &#34;并且填充的可选项将流出一个额外的空格字符,然后流式传输该值。

所以这段代码:

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

第一种情况下的额外空间给我带来了一些困惑。