c++ - std::optional:simple 和 ref-qualified value() 之间的有效区别

标签 c++ c++17 stdoptional

这是一个学术问题。 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/

相关文章:

c++ - Boost any_range 与 "canonical form"- 后者是什么?

c++ - 为什么std::reduce需要交换性?

c++ - 是否有其他类型的 void_t 的标准概括?

c++ - 如何最好地测试和解包std::if语句中的可选

c++ - 如何将包含 std::unique_ptr 的 std::optical 结构传递给函数?

c++ - 使用 std::optional 通过引用将 std::vector<int> 传递给函数

c++ - 如何在Qt无框窗口中实现QSizeGrip?

c++ - 包含文件中的问题

c++ - 为什么从 size_t 转换为 unsigned int 会给我一个警告?

c++ - STL 表示隐含交叉引用的数据结构的方法