将参数传递给函数作为r值引用与常量l值引用



让我们考虑以下函数:

void processString1(const string & str) { /** **/}
void processString2(string && str) { /** **/}
processString1("Hello");
processString2("Hello");

正如我所假设的,processString1将调用复制构造函数,processString2将调用字符串的移动构造函数。什么更有效?

您的理解在这里被误导了。

首先,这两个函数都不取值——它们都取一个引用。因此,当一个对象被传递给任意一个对象时,都不会调用构造函数——传递的任何对象都只是绑定到引用。

然而,您的函数调用传递了一个C字符串,并且存在从C字符串到std::字符串的隐式转换。

因此,每一个都将构造一个C字符串"Hello"的TEMPORARY std::string。

在第一种情况下,该临时对象将绑定到对const的引用,在第二种情况下绑定到对nonconst的rval引用。

该语言保证临时的生存期将至少在函数调用的生存期内存在。

两个函数调用都不进行任何构造——唯一的构造发生在C字符串隐式转换为std::string实例时。

最新更新