Почему нулевая ссылка печатается как «ноль»

Самый простой способ подумать об этом - это сравнить его с выводом аргумента шаблона.

Учитывая:

template<typename T>
void deduce(T) { }

Если вы вызываете:

deduce(px);

, тогда аргумент шаблона T будет выведен как int*, и если вы назовете

deduce(rx);

, тогда T будет выведено как int, а не int&

Вы получаете те же типы, которые были выведены при использовании auto.

Можно было бы провести аналогию с типами указателей, ожидая, что выведенный тип arx будет int&

< / blockquote>

Для подобной аналогии вам придется иметь довольно запутанную модель языка C ++. Просто потому, что они объявлены синтаксически схожими способами, так как Type@ с типом и модификатором не делают их одинаковыми. Указатель - это значение, объект, и его можно скопировать и изменить его значение путем назначения. Ссылка не является объектом, это ссылка на какой-то объект. Ссылка не может быть скопирована (копирование копирует референт) или изменено (присвоение ему изменяет референт). Функция, возвращающая указатель, возвращает объект по значению (объект является объектом-указателем), но функция, возвращающая ссылку (например, ваш GetBigClass()) возвращает объект ссылка . Это совершенно другая семантика, попытка провести аналогию между указателями и ссылками обречена на провал.

13
задан John Kugelman 10 September 2011 в 20:17
поделиться