将非常量左值引用绑定到右值

Ric*_*ich 5 c++

#include <iostream>
using namespace std;

int main() {
    int &&rfint = 10;
    int &l = rfint;
    std::cout << l << std::endl;
    std::cout << ++l << std::endl;
    std::cout << &l << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用上述构造,我可以10通过非常量左值引用直接操作prvalue l。我什至可以接受prvalue的地址。这是如何运作的?与延长寿命有关吗?

Ant*_*vin 3

[dcl.init.ref]/5:

\n\n
\n

对类型 \xe2\x80\x9c cv1 T1 \xe2\x80\x9d 的引用由类型 \xe2\x80\x9c cv2 T2 \xe2\x80\x9d 的表达式初始化,如下所示:
\n ...
\n (5.2. 2.2) \xe2\x80\x94 如果T1是非类类型,则创建 \xe2\x80\x9c cv1 T1 \xe2\x80\x9d 类型的临时变量,并从初始化表达式复制初始化 (8.5)\n。然后该引用将绑定到临时对象。

\n
\n\n

因此int &&rfint = 10;创建一个临时对象,并且引用绑定到它,而不是绑定到10它本身。

\n\n

是的,该临时对象的生命周期延长至 的生命周期,因此您可以在范围内rfint对其执行任何操作。rfint

\n