【发布时间】:2018-02-23 10:48:29
【问题描述】:
当使用 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;
}
【问题讨论】:
-
另外,如果您要返回参考,this 可能是相关的。
-
如果它返回
/*const*/T&BTW,你会遇到类似的问题。 -
返回
T会多出一个move。 -
在您的旧代码中,您将临时 T 分配给 T&。我永远不会那样做。即使它以某种方式起作用,它也会令人困惑并且没有意义,并且只是在乞求问题。这对你来说不是一个悬而未决的参考吗?即使标准的某些晦涩的方面允许它工作,它也没有任何意义。如果要保留该值,请将其分配给一个值,而不是引用。我会说 C++ 中的设计缺陷(如果有的话)是您的旧代码完全可以工作。
标签: c++ c++17 stdoptional