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,但我不明白原因。
std::move应用于 a 的值const optional?optional ov仍然持有vector?是否ov.value()在内部创建一个临时副本,然后从中移动?
Sam*_*hik 18
为什么 std::move 应用于 const 可选的值是合法的?
当然可以,为什么不呢?所有这std::move一切都是对右值引用的强制转换。你最终会得到一个const对象的右值引用。这没什么不寻常的。
为什么可选的 ov 仍然保存向量?
因为它是const,而且无法改变。
为了移动物体,必须满足几个条件。std::move照顾到最重要的一项,但其他所有项也必须得到满足。
这是一种常见的误解,认为到处喷涂std::move可以保证通过魔法将物体从一个地方超级高效地移动到另一个地方。这不是真的,这不是事实std::move,这只是有时为了移动某些东西而需要的演员阵容。但这并不是所需要的全部,只是最重要的部分。