我有几个关于如何boost::optional
工作的问题。让我们首先这样做:
boost::optional<int> i;
- 总是
i < 3
等价于*i < 3
(并且对于其他关系运算符类似)? - 条件
i < 3
和*i < 3
未定义是否正确?(i
还没有设置任何东西) std::cout << i
应该打印什么?- 我很确定这
i = 3
始终与*i = 3
. 如果是这样,我应该更喜欢哪个?
我有几个关于如何boost::optional
工作的问题。让我们首先这样做:
boost::optional<int> i;
i < 3
等价于*i < 3
(并且对于其他关系运算符类似)?i < 3
和*i < 3
未定义是否正确?(i
还没有设置任何东西)std::cout << i
应该打印什么?i = 3
始终与*i = 3
. 如果是这样,我应该更喜欢哪个?i
未初始化,第一个将返回 true,而第二个将断言。operator<
清楚地表明,如果左侧参数未初始化,它将true
在设置右侧操作数时返回。operator<<
foroptional
所以我假设它会返回unspecified-bool-type
转换并打印 1 或 0(真/假)。i
未初始化,则后者将断言,而前者将初始化并分配。您应该使用表明您想要的语义的那个。关于第 3 点,在 boost/optional/optional_io.hpp 中声明了 boost::optional的operator<<,但您可能不包括在内。(如果您碰巧使用了 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'
第一种情况下的额外空间让我有些困惑。