最近,我试图完全理解右值和左值的区别及其在c ++中的含义,然后我停止了const
右值的引用赋值。
我的意思是。
当我们谈论右值时,我们会想到一些匿名值,我们无法引用(&&
运算符,我这次没有提及,因为在这种情况下它不相关。如果我我错了。)。
而且由于我们无法引用它,因此无法将其分配给引用变量,例如int& a = 5;
,我明白了。
但是在某些情况下,我们可以做到,而且引用是const的,例如const int& a = 5;
我试图理解为什么会这样,而我无法真正弄清为什么这是可能的。为什么只有当我们不能更改此引用时才能引用它?例如。当我试图通过gcc进行检查时,发现它是如何完成的,该编译器会在堆栈上腾出一些空间,然后将该右值放到那里。完全像这样:
C ++:
int main() {
const int &a = 7;
}
组装:
main:
push rbp
mov rbp, rsp
mov eax, 7
mov DWORD PTR [rbp-12], eax
lea rax, [rbp-12]
mov QWORD PTR [rbp-8], rax
mov eax, 0
pop rbp
ret
我清楚地看到了有价值的东西,我们可以参考和修改。 那么为什么分配非const引用有问题呢?我们不能使用相同的程序集吗? (我也尝试过使用字符串引用,但没有区别,除了一些构造函数和类似的调用。指针仍然在堆栈上;当然,我知道,c ++的机器代码实现远低于c ++,但是我试图找到非const引用问题的原因)
这是c ++所做的抽象的逻辑结果吗?我应该将其视为“由于c ++概念,它才可以那样工作”,或者还有其他解释,对于低层次的理解可能更清楚?