2016-04-01 12 views
4
#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; 
} 

Unter Verwendung des obigen Konstrukts rvalue, kann ich direkt die prvalue 10 durch den nicht-const lvalue Referenz l manipulieren. Ich kann sogar die Adresse des prvalue nehmen. Wie funktioniert das? Handelt es sich um extended lifetime?Bind nicht-const lvalue Referenz

Antwort

2

[dcl.init.ref]/5:

Ein Verweis auf den Typ „CV1T1“ durch einen Ausdruck des Typs initialisiert „CV2T2“ wie folgt:
.. .
(5.2.2.2) - Wenn T1 ist ein nicht-Klasse-Typ, eine temporäre vom Typ „cv1T1“ und kopieren initialisiert (8.5) vom Initialisierungsstab exp erstellt Ression. Die Referenz ist dann an das Temporäre gebunden.

So schafft int &&rfint = 10; eine temporäre, und der Verweis auf die es gebunden ist, nicht selbst 10.

Und ja, die Lebensdauer dieses temporären verlängert sich auf die Lebensdauer von rfint, so dass Sie tun können, was Sie wollen, während rfint im Anwendungsbereich ist.

Verwandte Themen