让我们考虑以下功能:
void processString1(const string & str) { /** **/}
void processString2(string && str) { /** **/}
processString1("Hello");
processString2("Hello");
我假设,processString1将调用复制构造函数,processString2将调用字符串的移动构造函数。什么更有效率?
您的理解在这里被误导了。
[首先,这些函数均未获取值-它们均具有引用。因此,当一个对象传递给任一对象时,不会调用构造函数-传递的任何对象都仅绑定到引用。
但是,您的函数调用传递了一个C字符串-并且存在从C字符串到std :: string的隐式转换。
因此,每个人都会构造C字符串“ Hello”的tempstARY std :: string。
在第一种情况下,该临时对象将绑定到对const的引用,在第二种情况下,将绑定到rval-对非常量的引用。
语言保证临时函数的生存期至少存在于函数调用的生存期。
这两个函数调用都不做任何构造-唯一的构造发生在C字符串被隐式转换为std :: string的实例时。