std::move 到底做了什么?C++ 移动到底是什么?move 后的对象还可以使用吗?
最近几天听到了一些对 C++ 不太对的看法,如下:
- move 后的对象不能用了
- 因为 move 移动了 C++ 对象的所有权,所以原本的对象不能再使用了
- 函数返回值 T 类型时候 return std::move(T {});
本文暂时不考虑 pod 类型,pod 类型的做法通常直接进行拷贝。所以基于 class T 类型进行讨论:
move 的实现
强制转化成了 && 类型
移动函数
为什么要调用 std::move,因为需要你强制转为 && 类型,调用移动相关的函数。
但是请注意,C++ 20 前的定义是这样,这就意味着如果你不加上 move 函数,则会调用拷贝相关的函数。
然而 C++ 20 修改了标准,更符合直觉的调用
所有权是什么?
这是书的作者为了易于读者理解而引入的概念,本质 C++ 没有这个概念,强烈依赖于 class T 中移动函数的实现。
例如 C++ 标准库中的大部分类类型,都支持 move 后的对象赋值后重新使用。
这和 Rust 语言有本质的区别,可以认为这是 C++ 的一种设计哲学,为了减少系统调用分配内存的消耗。
std::move 到底做了什么?C++ 移动到底是什么?move 后的对象还可以使用吗?
https://love1angel.github.io/2024/05/02/languages/cpp/realize/move/