我想我问错了问题...
问题是,从c ++源代码到具有中间汇编步骤的机器语言代码的路径是什么?
因此,当编译器开始将源代码转换为汇编代码时,它会做一些重要的事情:
int x {1};
由编译器转换为三件事:
x
,x
对象的地址 [编者注:OP忘记了“用值1初始化x
的代码”]
因此在计算机级别上,此地址有地址和该值的字节数, 我认为这就是所谓的左值。
但是,如果编译器将一个值放入处理器寄存器中,但未在内存中为其提供地址,则该值在源代码中将表示为rvalue。
我想知道这种理解是否正确,并且建议的重复项未回答该问题。
答案 0 :(得分:1)
不。您的理解不正确。没有什么可以阻止编译器将x
放入寄存器的-除非它需要x
的地址(因为代码其他部分对x
的其他引用)。
非常粗略的说,lvalue
是可以分配给它或使用其地址的东西(使用&
运算符); rvalue
是表达式的结果。
当然,如果您声明了x
const,则实际上无法为其赋值-但这并不能阻止它成为左值。
答案 1 :(得分:0)
您遇到的方法错误。 C ++语言规范指定了如何理解C ++源代码。这包括定义的含义,例如int x{1}
。该标准还告诉我们x
是左值。
编译器知道x
是一个左值,但这在生成代码时不是很重要。知道这是一个左值会告诉您您可以做什么x
。编译器完全知道您在中使用x
所做的事情。如果您根本不使用x
,则编译器甚至可能完全忽略x
!