![](/img/trans.png)
[英]Why does the const rvalue qualified std::optional::value() return a const rvalue reference?
[英]Why std::optional::value() &&; return &&?
我有运行时错误,当使用std :: optional替换一些代码时:
旧代码:
T getValue();
...
const auto& value = getValue();
value.get();
新代码:
std::optional<T> getValue();
...
const auto& value = getValue().value();
value.get(); // Runtime error, crash
这对我来说无法预测。 崩溃的原因是该方法返回T&&
。
我的问题是在什么情况下T&&
可能有用,为什么该方法不返回T
完整代码:
#include <experimental/optional>
#include <iostream>
#include <memory>
struct Value {
std::unique_ptr<int> a = std::make_unique<int>(5);
};
std::experimental::optional<Value> getValue() {
Value v;
return v;
}
int main() {
const Value& value = getValue().value();
std::cout << *value.a << std::endl;
return 0;
}
这是两个相互竞争的需求造成的一个小设计缺陷。
首先,避免额外的移动,第二次启用参考生命周期延长。
这两个在当前的C ++中竞争; 你通常不能同时解决这两个问题。 所以你会看到代码在做一个或另一个,非常随意。
我个人发现返回一个右值引用来产生更多问题,而不是从一个即将被销毁的对象移动,但那些标准化std::optional
不同意。
我的首选解决方案还有其他缺点。
要解决这个问题 - 不必做出这些妥协 - 我们需要对生命周期扩展的工作方式进行复杂的重新定义。 所以我们现在必须忍受这些问题。
返回T
强制移动构造它,而返回(rvalue-)引用没有成本。
假设你有
std::optional<std::array<T, N>> getOptional();
然后
getOptional().value()
会做几个副本(RVO在这里不适用,因为它会返回一个(移动的)成员)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.