【问题标题】:Comparison (<), output (<<) and assignment (=) for boost::optionalboost::optional 的比较 (<)、输出 (<<) 和赋值 (=)
【发布时间】:2013-06-29 23:10:36
【问题描述】:
我有几个关于boost::optional 工作原理的问题。让我们先这样做:
boost::optional<int> i;
-
i < 3 是否总是等同于 *i < 3(其他关系运算符也类似)?
- 条件
i < 3 和*i < 3 未定义是否正确? (i 仍未设置任何内容)
-
std::cout << i 应该打印什么?
- 我很确定
i = 3 始终与*i = 3 相同。如果是这样,我应该更喜欢哪个?
【问题讨论】:
标签:
c++
boost
boost-optional
【解决方案1】:
- 没有。如果
i 未初始化,则第一个将返回 true,而第二个将断言。
- 没有。
operator< 的文档清楚地表明,如果左侧参数未初始化,它将在设置右侧操作数时返回 true。
-
optional 没有 operator<<,所以我假设它会返回 unspecified-bool-type 转换并打印 1 或 0(真/假)。
- 它们不一样。如果
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'
第一种情况下的额外空间让我有些困惑。