在该C++ std::map赋值场景中使用std::move是否有意义?
问题代码
std::map<int, double> function_xx() { std::map<int, double> xx_map; .... //some code return xx_map; } std::map<int, double> function_yy() { std::map<int, double> yy_map; .... //some code return yy_map; } void function_abc() { std::map<int, double> abc_map; // some code if (match_situation_xx) { abc_map = std::move(function_xx()); } else if (match_situation_yy) { abc_map = std::move(function_yy()); } // other code }
问题判断
提问者认为:此场景中使用std::move并无意义,因为std::map已实现map& operator=( map&& other ),而函数的返回值本身就是右值。这个判断是否正确?
回答
你的判断完全正确,这里的std::move确实是多余的,没有任何实际意义:
- 函数
function_xx()和function_yy()的返回值是纯右值(prvalue),本身就满足std::map移动赋值运算符(map& operator=(map&&))的参数要求,不需要额外用std::move强制转换。 - 加上
std::move后,只是把原本的纯右值转换成了将亡值(xvalue),最终还是会调用同一个移动赋值运算符,不会带来任何性能提升或功能变化。 - 从优化角度来说,多余的
std::move不会带来好处,完全属于多此一举的操作。
直接写成abc_map = function_xx();就能触发移动语义,和加std::move的效果完全一致。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

