You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

声明左值变量后无需保留时,传递至函数是否必须使用std::move?

左值变量转存vector,到底要不要用std::move?

咱们先把核心结论摆出来:如果你有个已经声明好的左值变量(比如你说的string),后续再也不用它了,还想避免拷贝把它塞进vector里——必须用std::move,没跑儿。

为啥非得用std::move?

C++这玩意儿默认认死理:你传左值(比如直接写变量名),它就会老老实实做拷贝构造。举个例子,要是你直接调用add(my_str),函数里的参数s会复制一份my_str的所有字符,大字符串的话这开销可不小,完全没必要。

但你用std::move(my_str)就不一样了,它相当于给编译器递了个话:“这变量我不用了,你直接把它的资源挪走就行!”这时候编译器会触发移动语义——说白了就是把原变量内部的指针啥的直接转移给新对象,几乎没开销。原变量会变成“有效但不能用”的状态,刚好符合你后续不再用它的需求。

聊聊你给的示例函数

你写的这个函数:

void add(string s){ my_vector.push_back(move(s)); }

本身没毛病,但还能再优化一步:把参数改成右值引用,省掉一次移动操作:

void add(string&& s){ my_vector.push_back(move(s)); }

调用的时候还是得用std::move(my_str)传参,这样直接把s的资源挪进vector,全程就一次移动,效率拉满。

或者更干脆,直接跳过封装函数,用vector的emplace_back:

my_vector.emplace_back(std::move(my_str));

它会直接在vector的内存里构造string对象,一步到位,连中间参数的传递都省了。

最后提个醒

用了std::move之后,原变量可千万别再用了啊!它的内部资源已经被掏空了,再用容易出幺蛾子。要是你后续还得用这个变量,那老老实实拷贝吧,别折腾移动了。

内容的提问来源于stack exchange,提问作者user4222907

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:54:39