对std::optional<std::vector<int>>执行std::move是否安全合法?
结论
你对std::optional<std::vector<int>>执行的std::move操作完全符合C++标准规范,运行安全,不存在合规性问题。
具体说明
std::optional的移动构造是C++17及之后版本标准明确规定的合法语义:当你调用auto to = std::move(from);时,会触发std::optional<std::vector<int>>的移动构造函数,行为完全可控:- 若移动前
from为空(处于std::nullopt状态):移动后的to也为空,from仍保持空状态 - 若移动前
from包含有效值:会将from内存储的std::vector<int>移动构造到to的存储空间中,from仍保持“包含有效值”的状态,但它内部的vector会进入移动后的合法但未指定状态(比如size可能变为0,原有元素被移走)
- 若移动前
- 你的场景中
std::vector<int>的移动构造是noexcept修饰的,整个移动操作不会抛出任何异常,不会触发运行时错误 - 只要你在移动操作后不对
from的内部vector做未重置的读取操作,整个逻辑完全没有问题
代码说明
你的示例代码本身没有任何问题:
std::optional<std::vector<int>> from; // 执行相关计算... auto to = std::move(from); // 执行后续计算...
如果后续你还需要使用from变量,只需给它重新赋值即可恢复正常使用:
from = std::vector<int>{1,2,3}; // 重置后可正常读写内部vector
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

