常数为C(11)

前端之家收集整理的这篇文章主要介绍了常数为C(11)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么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)是一个有效的表达式,即使没有用.

猜你在找的C&C++相关文章