2016-04-01 3 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; 
} 

Используя описанную выше конструкцию, можно непосредственно манипулировать prvalue 10 через неконстантные ссылки именующего l. Я могу даже обратиться к адресу prvalue. Как это работает? Связано ли это с extended lifetime?переплет Неконстантной ссылки на RValue именующего

ответ

2

[dcl.init.ref]/5:

Ссылка на тип «CV1T1» инициализируется выражением типа «CV2T2» следующим образом:
.. .
(5.2.2.2) - Если T1 типа внеклассового, временный типа «cv1T1» создаются и копирование инициализированных (8.5) от инициализатора ехра ression. Ссылка затем привязана к временному.

Так int &&rfint = 10; создает временный характер, и ссылка связывается с ней, не 10 себя.

И да, срок службы этого временного объекта продлевается до срока службы rfint, поэтому вы можете делать с ним все, что хотите, а rfint - в объеме.

Смежные вопросы