Skip to content

Instantly share code, notes, and snippets.

@huanghantao
Last active December 10, 2019 03:16
Show Gist options
  • Save huanghantao/64054958c7fa05720b4779903fe6d532 to your computer and use it in GitHub Desktop.
Save huanghantao/64054958c7fa05720b4779903fe6d532 to your computer and use it in GitHub Desktop.

03 | 右值和移动究竟解决了什么问题?

非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")); //同上,右值不能赋值给左值引用
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment