为什么const int不是C(11)中的R值?我认为R值是“任何东西”,不能在左边,常数也是这样.此代码失败:
int f(int && x) { return 100; } void g() { const int x = 1; f(x); } error: invalid initialization of reference of type ‘int&&’ from expression of type ‘const int’
解决方法
好的,有三类表达式1:
>代表具有身份并且无法移动的对象的那些;
>代表具有身份并可以移动的对象的那些;
>代表不具有身份并可以移动的对象的那些;
第一个被称为左值,第二个是左值,第三个是左值.如果我们把lvalues和xvalues放在一起,我们就会有gl.. Glvalues是表示具有身份的对象的所有表达式.如果我们把x值和prvalues放在一起,我们就有价值. Rvalues是表示可以移动的对象的所有表达式.
有问题的表达式x是一个愚蠢的:可以写& x,所以对象显然有一个身份.
我们可以从这个表达中移开吗?这个对象即将过期吗?不它不是.它只会在当前表达式的某个时间过期.这意味着它不能被移开.这使它成为一个左派.
所有这些名字可能有点混乱,因为C中的左值和右值不再意味着它们在C起源中的含义. C意义与分配的左侧或右侧完全无关2.
个人而言,我喜欢使用Bjarne的this paper中的术语:iM值(而不是lvalues),im值(而不是x值),Im值(而不是prvalues),i值(而不是glvalues),以及m值(而不是右值).这不是标准使用的术语,不幸的是.
1这里“有身份”是指“其地址可以采取”; “可以从”意味着即将到期,由于其临时性质,或者因为程序员通过调用std :: move或类似的方式在类型系统中做出明确的规定.
2你可以在赋值的左边有右值:std :: vector< int>(17)= std :: vector< int>(42)是一个有效的表达式,即使没有用.