2014-09-30 10 views
2

Я ищу нормативную ссылку на Стандарт.Официальные отличия T, T & T &&

Мы можем объявить переменную ссылочного типа следующим образом:

int a = 5; 
int &b = a; 

Формально, тип a является int, но тип b является int&. Итак, почему мы можем инициализировать int& с помощью int? Я искал стандартное преобразование для этих типов, но похоже, что нет.

+0

тип как '' A' и b' такое же: '' INT &. В вашем коде оба ссылаются на * тот же * объект в памяти. – Nawaz

+0

@Nawaz Почему? Объявленным типом 'a' является' int'. Это очевидно из декларации. – 2014-09-30 04:56:31

+0

Вы говорите о 'decltype (a)', и я говорю о 'decltype ((a))'. Заметила разницу? Пожалуйста, прочитайте об этом. – Nawaz

ответ

4

Вы можете инициализировать int& с int, потому что стандарт говорит:

переменная объявлена ​​T& или T&&, то есть, «ссылка на тип T» (8.3.2), должны быть инициализированы объект или функцию типа T или объектом, который может быть преобразован в T.

(N3936, 8.5.3/1)

Там нет "стандартного преобразования" от T к T& и

Когда параметр ссылочного типа соединяется непосредственно (8.5.3) к выражению аргумента, неявное преобразование представляет собой преобразование идентичности , если выражение аргумента не имеет тип, который является производным классом типа параметра , и в этом случае неявный conv Последовательность инверсии представляет собой преобразование с производной базой (13.3.3.1).

(N3936, 13.3.3.1.4/1; курсив мой)

+0

Спасибо за этот ответ, но не могли бы вы пояснить следующий момент, пожалуйста? Если мы инициируем ссылку следующим образом: 'int a = 5; int &c = a; int &d = c; 'последний referecnce не инициализируется объектом. Формально он инициализируется ссылкой, привязанной к объекту, а не самим объектом. Поскольку ссылка не является объектом, мы можем применить это правило к случаю, который я привел здесь? – 2014-09-30 17:11:33

+0

@DmitryFucintv Ссылка * есть * объект. См. 5/5. Выражение ссылочного типа lvalue настраивается как lvalue не ссылочного типа. – Brian

+0

Отлично, спасибо! – 2014-10-01 04:38:57