2015-12-21 3 views
3

Могу ли я узнать, почему этот кусок кода действителен. Спасибо.Изменение типа в rvalue

double i=5;//int i=5 will invalidate this piece of code 
    int && r1=i; 
    std::cout<<r1<<std::endl; 
+0

Не могли бы вы выделить конкретную подозрительную вещь в теле вопроса? –

+0

Потому что, если это int i = 5, то он становится недействительным, потому что ссылка привязана к lvalue – Des1gnWizard

+0

Хотя я не уверен, я полагаю, что ссылка связывается с rvalue, которая является результатом неявного преобразования. –

ответ

4

[dcl.init.ref]/1 Переменная объявлена ​​T& или T&&, то есть, "ссылка на тип T" (8.3.2), должны быть инициализируется объекта или функции типа T или объектом, который может быть преобразован в T.

[dcl.init.ref]/5 Ссылка на тип "cv1 T1" инициализируется выражением типа "cv2 T2" следующим образом:

...

(5.2.2.2) - Если T1 является неклассовым типом, временный тип «cv1 T1» создается и инициализируется с копией (8.5) из выражения инициализатора. Ссылка затем привязана к временному.

+0

Спасибо за ссылку :-) – Des1gnWizard

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