1.30、push_back()左值和右值的区别是什么?

• 左值传参时,push_back会调用拷贝构造函数。因为左值是有名字的持久对象,不能安全地“窃取”其资源,只能通过拷贝完整复制一份数据到容器中,保证原对象不变。

• 右值传参时,push_back会调用移动构造函数。右值通常是临时对象或明确标记为可“移动”的对象(如通过std::move转换的左值),其资源可以被“窃取”而无需复制,从而避免了昂贵的深拷贝,提高性能。

总结来说,push_back利用函数重载区分左值和右值:

参数类型 语义 调用的构造函数 说明
左值(const T& 拷贝语义 拷贝构造函数 复制数据,原对象保持不变
右值(T&& 移动语义 移动构造函数 资源“窃取”,避免不必要的复制

此外,可以通过std::move将一个左值显式转换为右值,从而触发移动构造,提升性能,但调用后原对象处于“空壳”状态,不应再使用其原有数据。

面试中可以这样表述:
push_back接收左值时,会调用拷贝构造函数复制对象;当接收右值时,则调用移动构造函数“窃取”资源,避免复制,从而提升性能。通过std::move可以将左值转为右值,显式启用移动语义。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

 

阅读剩余
THE END