从Boost 1.56开始,Boost可选支持移动语义。在这种情况下,以下构造是否有意义?
boost::optional<SomeType> getValue()
{
if (value_available) { // value_available is a boolean
return std::move(value); // value is of type SomeType
} else {
return boost::none;
}
}
答案 0 :(得分:1)
如果您只需要调用getValue()
一次,或者如果适用于拥有转移语义,那么它才有意义,因为它会在第一次调用后销毁value
。
答案 1 :(得分:1)
是的,这将是有意义的。这意味着你从value
移动,以防你拥有它。
但是,当语义该类已经包含可选值(value_available
是指示符时,返回为可选,这让我感到惊讶这一点)。
所以,我建议将value
存储为optional<T>
而只返回
return value; // already optional!
在这种情况下,您可以免费获得适当的移动语义和RVO。当然,如果value
不是本地的或临时的,您需要说
return std::move(value);
(旁注:我不同意另一个答案,如果
getValue()
只被调用一次,那么仅有用。如果你的类型有明确定义的“默认”状态移动后返回,然后它可能成为一种“单元素队列”。)在这种情况下,在返回之前显式取消初始化源值可能会很好。我认为以异常安全的方式实现这种交换是很棘手的。
考虑将功能重命名为例如
popValue()
,extractValue()
或consume()
明确提及使用此函数从内部对象状态移动的事实。当然,成员函数不是const
这一事实已经隐含地存在一些警告,但良好的命名也很重要