非const左值引用不能使用右值对其赋值:
std::string& r = std::string(); //错误!std::string()产生一个临时对象,为右值
假设可以的话,就会遇到一个问题:如何修改右值的值?因为引用是可以后续被赋值的。根据上面的定义,右值连可被获取的内存地址都没有,也就谈不上对其进行赋值。
但const
左值引用不一样,因为常量不能被修改,也就不存在上面的问题:
const std::string& r = std::string(); //可以
我们经常使用const
左值引用作为函数的参数类型,可以减少不必要的对象复制。
#include <string>
class MyString {
public:
MyString(std::string& s); //参数类型为左值引用
};
int main()
{
MyString s1("xxx"); //错误
MyString s2(std::string("xxx")); //同上,右值不能赋值给左值引用
}
把MyString(std::string& s);
改成MyString(const std::string& s);
就不会有上面的编译错误:
#include <string>
class MyString {
public:
MyString(const std::string& s); //参数类型为左值引用
};
int main()
{
MyString s1("xxx"); //错误
MyString s2(std::string("xxx")); //同上,右值不能赋值给左值引用
}