为什么可以从 const std::Optional 中进行 std::move 值?

Mar*_*oll 13 c++ stdmove stdoptional

为什么下面的代码片段是合法的 C++ 代码?这是一个纯粹的理论问题 - 我没有想到任何用例:

#include <optional>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> v{1, 2, 3};
    const std::optional<std::vector<int>> ov = v;
    const auto nv = std::move(ov.value());

    for (const auto& x : *ov) { std::cout << x; }
    for (const auto& x : nv) { std::cout << x; }
}
Run Code Online (Sandbox Code Playgroud)

这产生了123123,但我不明白原因。

  1. 为什么 astd::move应用于 a 的值const optional
  2. 为什么optional ov仍然持有vector

是否ov.value()在内部创建一个临时副本,然后从中移动?

Sam*_*hik 18

为什么 std::move 应用于 const 可选的值是合法的?

当然可以,为什么不呢?所有这std::move一切都是对右值引用的强制转换。你最终会得到一个const对象的右值引用。这没什么不寻常的。

为什么可选的 ov 仍然保存向量?

因为它是const,而且无法改变。

为了移动物体,必须满足几个条件。std::move照顾到最重要的一项,但其他所有项也必须得到满足。

这是一种常见的误解,认为到处喷涂std::move可以保证通过魔法将物体从一个地方超级高效地移动到另一个地方。这不是真的,这不是事实std::move,这只是有时为了移动某些东西而需要的演员阵容。但这并不是所需要的全部,只是最重要的部分。

  • 这个答案是正确的,但似乎努力避免说出显而易见的事情:“move”是一个用词不当,因此它的用户在尝试记住这个函数实际做什么时应该忽略这个名称。 (8认同)
  • 您强调(通过重复两次)“std::move”并不是移动所需的一切,但是您能说出其他需要的东西吗?一个参考链接就足够了。 (4认同)