这里:
string s1("hi"),s2,s3;
s2=std::move(string("bye"));//正确:从一个右值移动数据
s3=std::move(s1);
书上说:在s2中传递给move的实参是string的构造函数的右值结果——string("bye")。
那可不可以直接传递"bye" 呢?这样传递的是一个左值还是右值?
不可以直接传“bye”,因为直接传“bye”默认的type是char [],所以加string()是构造一个string类型的“bye”
这个好凌乱啊,左值 ,右值,左手右手都快分不出来了。
应该化简一下用语:左值 就是数值,不能赋值;右值是变量,可以赋值。不要被术语玩死了。
语言组织都凌乱了,基本概念是:左值 就是等号左的值,如果是数值,就不能赋值,出现赋值的情况就有问题;右值可以是变量或数值,都没有问题。
lvalue=rvalue
而扩展开来,有一个类a和返回数值的成员b那么下面表达式中,i 是一个左值,a也是一个左值,b 是一个右值,因为有点号操作符,在左边的就是左值,右边的就是右值
int i = a.b();
C++本来就已经够复杂的了,C++11引入的std::move希望不要增加这种额外的负担,否则这样的语言就应该叫蛋痛语言了。
你需要一个string类型的右值就可以move