左值,右值

左值:

代表着一个对象的身份

右值:

代表着一个值的身份,是一个具体的数据值,不可以被修改

 1.

void r2(double& rx) { cout << rx << endl; }
r2(w + 1);
r2(w)
为何第二个合法

r2(w + 1)的表达式不合法,因为w + 1是一个右值,不能绑定到非常量引用的参数中。

而r2(w)的表达式合法,因为w是一个左值,可以绑定到非常量引用的参数中。在第一个调用中,表达式 w + 1 是一个右值,它只是简单地计算出一个值,而不会存储在内存中。因此对其进行非常量引用的传递会导致编译错误。而在第二个调用中,变量 w 是一个左值,它可以被引用,因此将其传递给非常量引用参数是合法的。

如果想要在第一个调用中使用r2()函数,可以将参数类型更改为常量引用类型

void r2(const double& rx) { cout << rx << endl; }
r2(w + 1);

这样,函数将接受一个double类型的右值作为参数,并可以在函数内部使用该值。

2. 

int foo() {
  return 42;
}

int x = foo();  // 这里的 foo() 是一个右值
int val = 42;

int& get_value() {
  return val;
}

get_value() = 100;  // 这里的 get_value() 是一个左值
double r(double x) {
  return x + 1;
}

int w = 3;
double y = r(w);  // 这里的 r(w) 是一个右值

3.

在函数里面它们的返回值

foo(double x)                     : 右值

foo(double &x)                   : 左值

foo(double &&x)                 : 右值     

foo(const double & x)         : 左值引用

单个

double x          : 左值 

你可能感兴趣的:(C++primer,plus中文版习题,算法)