const引用的右值分配和非const引用的右值分配问题背后的原因

时间:2019-04-25 18:37:21

标签: c++

最近,我试图完全理解右值和左值的区别及其在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 ++概念,它才可以那样工作”,或者还有其他解释,对于低层次的理解可能更清楚?

0 个答案:

没有答案