移动语义是 C++ 中的一种机制,允许在对象之间有效地移动资源,而不是复制它们。随着 C++11 的推出,引入了移动构造函数和赋值运算符,它们允许对象在不需要复制的情况下将其资源传递给另一个对象。
std::move 将传递的对象转换为 rvalue 引用,发出可以安全移动资源的信号。std::forward 用于模板中以在进一步传递时保留值的类型(lvalue/rvalue)。
#include <string> #include <vector> #include <iostream> std::vector<std::string> getNames() { std::vector<std::string> v = {"Alice", "Bob", "Charlie"}; return v; // 移动语义在这里生效 } int main() { std::vector<std::string> names = getNames(); // 此处 getNames() 的内容将被移动而无额外复制 }
std::move 与移动构造函数有什么区别?如果写了 std::move,是否总是会移动对象?
答案:
std::move 只是将对象转换为 rvalue 引用,它本身并不执行移动操作。移动操作仅在确实实现了移动构造函数/运算符的情况下才会生效。否则,会发生复制。
struct A { A() = default; // 没有移动构造函数 A(const A&) { std::cout << "复制! "; } }; A a1; A a2 = std::move(a1); // 发生复制,而不是移动
故事
故事
故事