这是一个学术问题。 std::optional<T>
类型有一个 T && value() &&
方法。我有以下定义:
class A { ... };
void f(A &&a);
以及以下程序:
std::optional<A> optA;
optA = A(1337);
f(std::move(optA).value()); // OPTION 1
f(std::move(optA.value())); // OPTION 2
std::cout << optA.has_value() << std::endl;
选项 1 和选项 2 之间有什么有意义的区别吗?对于选项 1,我会有 1
, 0
或未指定为输出?根据我的测试,has_value() 在这两种情况下都保持为真。
有没有可能的情况value() &&
对std::move
产生影响和 value()
?
最佳答案
std::move(optA).value()
之间没有区别和 std::move(optA.value())
. value()
只返回一个引用包含值的 glvalue,或者你可以有 value()
返回一个左值,然后通过 std::move
将其转换为一个亡值, 或者您可以调用 std::move
首先有value()
立即给你一个 xvalue(实际上,从 lvalue 到 xvalue 的转换将发生在 value()
方法本身的某个地方)。引用限定的重载在这个简单的例子中显然不是很有用,但是当可选的通过转发引用传递时会很有用 O&& o
,你想要 std::forward<O>(o).value()
“做正确的事”。
关于c++ - std::optional:simple 和 ref-qualified value() 之间的有效区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56671989/