Самый простой способ подумать об этом - это сравнить его с выводом аргумента шаблона.
Учитывая:
template<typename T>
void deduce(T) { }
Если вы вызываете:
deduce(px);
, тогда аргумент шаблона T
будет выведен как int*
, и если вы назовете
deduce(rx);
, тогда T
будет выведено как int
, а не int&
Вы получаете те же типы, которые были выведены при использовании auto
.
Можно было бы провести аналогию с типами указателей, ожидая, что выведенный тип
< / blockquote>arx
будетint&
Для подобной аналогии вам придется иметь довольно запутанную модель языка C ++. Просто потому, что они объявлены синтаксически схожими способами, так как
Type@
с типом и модификатором не делают их одинаковыми. Указатель - это значение, объект, и его можно скопировать и изменить его значение путем назначения. Ссылка не является объектом, это ссылка на какой-то объект. Ссылка не может быть скопирована (копирование копирует референт) или изменено (присвоение ему изменяет референт). Функция, возвращающая указатель, возвращает объект по значению (объект является объектом-указателем), но функция, возвращающая ссылку (например, вашGetBigClass()
) возвращает объект ссылка . Это совершенно другая семантика, попытка провести аналогию между указателями и ссылками обречена на провал.