问题

简述一下 std::move 做了什么才能将一个左值 c++对象中内存的所有权交给其他对象的,什么情况下对一个对象调用 std::move 之后这个对象依旧可以正常使用。

我的回答

如果面试官问我关于 `std::move` 的问题,我会这样回答:

std::move` 本身并不移动任何东西,它只是一个类型转换工具,将左值引用转换为右值引用。这个转换使得移动语义成为可能,告诉编译器:"这个对象可以被移动,我不再关心它的内容"。

当我们对一个对象调用 `std::move` 后,该对象会被转换为右值引用类型,这样在赋值或构造时会优先调用移动构造函数或移动赋值运算符,而不是拷贝操作。这些移动操作通常会"窃取"源对象的资源(如内存、文件句柄等),将所有权转移到目标对象,同时将源对象置于一个有效但未指定的状态。

至于 `std::move` 后对象是否可以继续使用,这取决于该类的实现:

1. 标准容器如 `std::vector`、`std::string` 在被移动后会处于有效但为空的状态,可以安全地继续使用。
2. 智能指针如 `std::unique_ptr` 被移动后会变为 null,也可以继续使用。
3. 对于自定义类,取决于移动构造函数和移动赋值运算符的实现。良好设计的类应确保被移动后的对象处于有效状态。

更多推荐