从返回Boost可选项的函数返回rvalue引用

时间:2015-03-18 04:49:40

标签: c++ c++11 boost move-semantics boost-optional

从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;
  }
}

2 个答案:

答案 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这一事实已经隐含地存在一些警告,但良好的命名也很重要