Andrew Koenig 写了一篇标题为Some Optimizations are more important than Others的文章,其中包含以下两个函数定义:
string rev(string s) {
reverse(s.begin(), s.end());
return s; // GCC-4.8 uses move constructor
}
string rev(string&& s) {
reverse(s.begin(), s.end());
return s; // GCC-4.8 uses copy constructor
}
这篇文章暗示第二个函数(结合const string&
重载)比第一个函数更有效。但是,当我使用 GCC-4.8 对其进行测试时,这不是我所看到的。第一个函数移动语句中的对象s
,return
而第二个函数复制对象。如果我将第二个函数中的 return 语句更改为return move(s);
,那么在这两种情况下都将移动对象。
问题:哪些参数可以在语句中自动移动?return
更具体地说,声明为非常量右值引用的参数可以自动移动吗?