比较 (<)、输出 (<<) 和赋值 (=) 用于提升::可选
Comparison (<), output (<<) and assignment (=) for boost::optional
我有几个关于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
optional
没有operator<<
,所以我假设它将返回unspecified-bool-type
转换并打印1或0(真/假)- 它们不一样。如果
i
未初始化,则后者将断言,而前者将初始化并分配。您应该使用一个指示您想要的语义的
关于点3,有一个运算符<lt;对于boost/option/optional_io.hpp中声明的boost::optional,但您可能没有包括它。(如果你碰巧使用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 = '--'
但是没有include的相同代码会产生这种情况,正如Mark B的回答所建议的那样:
var1 = '1'
*var1 = 'value'
var2 = '0'
第一种情况下的额外空间让我有些困惑。
相关文章:
- 可组合的lambda/std::函数与std::可选
- 使用gcc从静态链接的文件中查找可选符号
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 在 G++ v8.2.0 中使用 std::experimental::可选
- 标准::可选枚举的比较运算符
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- 命名空间 std:: 不包含可选
- 将可选属性表示为 C++类成员
- 如何使用可选的随机种子参数创建 roll_die() 函数
- 通过跳过可选参数来填充参数包
- 返回arg_min和可选min_val的算法
- std::可选实现为联合与字符[]/aligned_storage
- 如何使用 cin 使 c++ 成为可选?
- 有没有办法在 c++ 中显式调用可选参数?