§7.1.6.4 [dcl.spec.auto] p6
Как только тип идентификатор объявления определен в соответствии с 8.3, тип объявленной переменной с использованием объявления-идентификатор определяется по типу его инициализатора с использованием правил вывода аргументов шаблона.
Это означает только то, что auto
моделирует вывод аргументов шаблона во время вызова функции.
template<class T>
void f(T){} // #1, will also be by-value
template<class T>
void g(T&){} // #2, will always be by-reference
Обратите внимание, что # 1 всегда будет копировать переданный аргумент, независимо от того, передаете ли вы ссылку или что-то еще.(Если вы не укажете аргумент шаблона как f<int&>(intref);
.)