为什么下面的代码片段是合法的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; }
}
这会产生 123123
,但我不明白原因。
- 为什么对
const optional
的值应用std::move
是合法的? - 为什么
optional ov
仍然持有vector
?
ov.value()
是否在内部创建一个临时副本,然后再移动该副本?
std::move
时,我喜欢跟随一种策略,即被移动的对象处于有效但未指定状态(适合重新赋值或销毁)。总体而言,在OP代码中,由于“ov”是“const”,因此“std::move”将不会导致对象被清空并留下一个空的外壳。尽管如此,我发现遵循这个惯用语,即(可能)被移动的对象就像是一只前鹦鹉工作得很好。总体而言。(当然也有例外,例如从std::unique_ptr
中移动确实会使它保持在良好指定的状态。) - Eljaystd::vector<T>
也是一个例外 - 移动后的向量保证为空。 - Evgstd::vector<T>
,它始终处于空状态。 - Evg