右值引用的使用场景和意义
虽然const左值引用既能接收左值,又能接收右值,但左值引用终究存在短板,而C++11提出的右值引用就是用来解决左值引用的短板的。
左值引用的短板
左值引用虽然能避免不必要的拷贝操作,但左值引用并不能完全避免。
左值引用做参数,能够完全避免传参时不必要的拷贝操作。
左值引用做返回值,并不能完全避免函数返回对象时不必要的拷贝操作。
如果函数返回的对象是一个局部变量,该变量出了函数作用域就被销毁了,这种情况下不能用左值引用作为返回值,只能以传值的方式返回,这就是左值引用的短板。
比如下面我们模拟实现一个int版本的to_string函数,这个to_string函数就不能使用左值引用返回,因为to_string函数返回的是一个局部变量。
代码如下:
namespace cl
{
cl::string to_string(int value)
{
bool flag = true;
if (value < 0)
{
flag = false;
value = 0 - value;
}
cl::string str;
while (value > 0)
{
int x = value % 10;
value /= 10;
str += (x + '0');
}
if (flag == false)
{
str += '-';
}
std::reverse(str.begin(), str.end());
return str;
}
}
此时调用to_string函数返回时,就一定会调用string的拷贝构造函数。比如:
int main()
{
cl::string s = cl::to_string(1234);
return 0;
}
C++11提出右值引用就是为了解决左值引用的这个短板的,但解决方式并不是简单的将右值引用作为函数的返回值。