右值是否总是恒定的?

时间:2011-03-01 13:00:02

标签: c++

int i = 5;

int j = i;

在评估结果时,此表达式中的右值i是否为常量?

我问这个问题,因为在我的复制构造函数中,它的参数需要const

2 个答案:

答案 0 :(得分:15)

围绕左值/右值术语存在一个常见的误解。它们不是指变量,而是指表达式。表达式可以产生左值或右值,并且可以是const或非const。

特别是,在您的代码中,定义i右侧的表达式int j = i;是左值表达式,而不是右值。为了赋值,有一个左值转换的左值,然后分配给新声明的变量。

连续是一个正交概念 - 在大多数情况下 - 与你是否可以改变你正在处理的对象有关。

int f();
int& g();
const int& h();
const int k();

int main() {
  f();         // non-const rvalue expression
  g();         // non-const lvalue expression
  h();         // const lvalue expression
  k();         // const rvalue expression
  f() = 5;     // error, cannot assign to an rvalue
  g() = 5;     // correct, can modify a non-const lvalue
  h() = 5;     // error, cannot modify a constant lvalue
}

其他示例需要使用用户定义的类型:

struct test {
   void foo() { x = 5; }
   void bar() const;
   int x;
};
test f();
const test g();
int main() {
   f().foo();      // f() is a non-const rvalue, 
                   // but you can call a method on the resulting object
   g().foo();      // g() is a const rvalue, 
                   // you cannot call a mutating member function
   g().bar();      // but you can call a const member function
}

答案 1 :(得分:3)

在C ++中,内置类型的rvalues不能是const或非const。它没有意义。但是,可以有类类型的const和非const rvalues。

右值只是VALUE(不是对象/变量)。你对“非恒定价值”有什么理解?!