6

我有几个关于如何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. 如果是这样,我应该更喜欢哪个?
4

2 回答 2

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

关于第 3 点,在 boost/optional/optional_io.hpp 中声明了 boost::optionaloperator<<,但您可能不包括在内。(如果您碰巧使用了 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 = '--'

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

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

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

于 2014-10-01T22:50:20.027 回答