2

从 Boost 1.56 开始,Boost optional 支持移动语义。在那种情况下,以下构造有意义吗?

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

2 回答 2

1

仅当您只需要调用getValue()一次,或者所有权转移语义适用时,它才有意义,因为它value在第一次调用后销毁。

于 2015-03-18T05:21:07.307 回答
1

是的,这将是有意义的。这意味着你离开value,以防万一。

但是,令我惊讶的是,当类在语义上似乎已经包含一个可选值(是该值的指示符)时,您作为可选返回。value_available

所以,相反,我建议将其存储value并返回optional<T>

return value; // already optional!

在这种情况下,您可以免费获得正确的移动语义和 RVO。当然如果value不是本地或临时的,你需要说

return std::move(value);

(旁注:我不同意另一个答案,即这仅在仅调用一次时才有用getValue()。如果您的类型具有明确定义的“默认”状态以在移动后返回,那么它可能会变成一种“1 -元素队列”。)

在这种情况下,最好在返回之前显式取消初始化源值。我认为以异常安全的方式实现这种交换是很棘手的。

考虑将函数重命名为 eg popValue()extractValue()consume()明确提及使用此函数从内部对象状态移动的事实。当然,一些警告已经隐含地存在于成员函数不是const但良好的命名也很重要的事实中

于 2015-03-18T09:33:03.637 回答