gpt4 book ai didi

c++ - 为什么 std::optional::value() &&;返回 &&?

转载 作者:太空狗 更新时间:2023-10-29 20:21:04 26 4
gpt4 key购买 nike

当使用 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 的人不同意。

我首选的解决方案还有其他缺点。

为了解决这个问题——不必做出这些妥协——我们需要对生命周期延长的工作原理进行复杂而困惑的重新定义。所以我们现在必须忍受这些问题。

关于c++ - 为什么 std::optional::value() &&;返回 &&?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46219314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com