C++ 右值和左值之间的转换

C++ 右值和左值之间的转换,c++,rvalue,lvalue,C++,Rvalue,Lvalue,我试图理解并理解右值不能转换为左值。以下是好的 int x = 1; // x is an lvalue int y = 2; // y is an lvalue int z = x + y; // the "+" needs rvalues, so x and y are converted to rvalues //(from lvalues) and an rvalue is returned 现在如果我这样做了 x = 5; y = 6;

我试图理解并理解右值不能转换为左值。以下是好的

int x = 1;     // x is an lvalue
int y = 2;     // y is an lvalue
int z = x + y; // the "+" needs rvalues, so x and y are converted to rvalues 
               //(from lvalues) and an rvalue is returned
现在如果我这样做了

x = 5;
y = 6;
x和y不是转换成左值(从右值)吗


编辑:中的问题几乎没有涉及到转换,也没有例子可以解释。

左值的意思是“地址”。右值的意思是“价值”。表达式是左值或右值。作为表达式,
x
是一个左值,但是,在表达式
z=x+y中
运算符+需要数据,因此
x
y
被取消引用。也就是说,取它们地址上的值,将这些右值相加,生成一个等于其和的右值。赋值运算符左侧需要一个左值,右侧需要一个右值。它将右边的值放入左边的地址中,因此
z
不会被取消引用,而是一个左值


x
这样的变量在了解其上下文之前不能称为左值或右值

准确地说出我们在说什么很重要

    在C++中,表达式有一个类型,可以是Lvalue或rvalue(value类别)
  • 当一个表达式(类型,值类别)出现在需要不同(类型,值类别)的上下文中时,会发生隐式转换
  • 显式转换使用语言的一个强制转换运算符,将一个(类型,值类别)的子表达式作为操作数,并生成另一个(类型,值类别)的表达式作为结果
左值或xvalue可以隐式转换为prvalue;由于历史原因,这被称为从左值到右值的转换。线路

int z = x + y;
作为此隐式转换的示例。正如注释所解释的,内置的
+
运算符期望prvalues作为其操作数,但我们提供了左值,因此发生了隐式转换

左值也可以显式转换为xvalue:

std::string s1 = static_cast<std::string&&>(s2);  // i.e., std::move(s2)
因为
++
操作符需要一个左值,我们提供了一个右值。下面的代码也不会编译,我们试图显式地将右值转换为左值:

static_cast<int&>(3)++;

因为当赋值给
int
lvalue时,需要一个prvalue作为右操作数,并且提供了一个prvalue。尽管我们正在执行某种类型的操作,将右值作为源,将左值作为目标,但这并不是根据语言规则进行的转换。

不,它们是从右值分配的。在
x+y
中可能存在重复,用
x
y
表示的对象被复制到函数
int操作符+(int,int)
的实际参数中。“x和y转换为右值”不适用true@Caleth我遇到这个问题的地方是
x
y
不要改变。表达式
x
始终是
int
类型的左值表达式。使用
x
的值,在右值上下文中表达式
x
始终是左值。语句
intx
x
定义为int类型的对象,语句
intx=1
定义
x
并对其进行初始化。在我看来,当我们不谈论指针时,使用指针术语是令人困惑的。而且无论上下文如何,
x
肯定是一个左值。
static_cast<int&>(3)++;
x = 5;
y = 6;