通常当一个函数返回时,boost::optional
我看到很多人返回一个空括号{}
来指定一个空值,它工作正常并且比返回短boost::none
。
我试图做一些类似于 empty a 的事情boost::optional<int>
,但是当在右侧使用空括号调用复制赋值运算符(或者很可能是移动赋值操作)时,空括号被转换为 int 然后将该值分配给可选的,所以我最终将变量设置为 0 而不是我期望的空值。这是一个示例https://godbolt.org/g/HiF92v,如果我尝试相同的操作,std::experimental::optional
我会得到我期望的结果(只需在示例中替换为 std::experimental::optional ,您就会看到说明变成mov eax, eax
)。
此外,如果我尝试为 boost 可选(非整数类型)使用不同的模板参数,则某些编译器会编译(具有我期望的行为,此处为http://cpp.sh/5j7n的示例)而其他编译器则不会。因此,即使对于相同的库,行为也会根据模板 arg 有所不同。
我想了解这里发生了什么,我知道这与我将 C++14 功能用于设计中没有考虑到这一点的库这一事实有关。我阅读了boost/optional
标题,但我迷失了细节,我还尝试研究编译后的代码,而不用内联类似的结果。
我正在使用带有 -std=c++14 和 boost 1.57 的 gcc 4.9.2。
顺便说一句:我知道我应该使用boost::optional::reset
or boost::none
,但我试图与代码库其余部分的语义保持一致。