我有一些关于boost::optional
如何运作的问题。我们先这样做:
boost::optional<int> i;
i < 3
是否始终等同于*i < 3
(和其他关系运营商类似)?i < 3
和*i < 3
未定义是否正确? (i
仍未设置任何内容)std::cout << i
应该打印什么?i = 3
始终与*i = 3
相同。如果是这样,我应该选择哪一个?答案 0 :(得分:9)
i
未初始化,则第一个将返回true,而第二个将断言。operator<
的文档清楚地表明,如果左手参数未初始化,则在设置右手操作数时将返回true
。operator<<
没有optional
所以我认为它会返回unspecified-bool-type
转换并打印1或0(真/假)。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'
第一种情况下的额外空间给我带来了一些困惑。