Что на самом деле происходит
auto
выводит тип переменной из типа переменной, используемой для ее инициализации 1 . Я не могу найти, чтобы кто-нибудь на самом деле вышел и сказал это 2 , но я подозреваю, что ссылка не выводится, потому что нет такой вещи, как переменная ссылки. Ссылки не существуют как независимые лица. Это просто удобное новое имя, псевдоним , для существующей переменной. После того, как все ссылки решены
auto result = fn2(var1, var2);
может быть также
fn2(var1, var2);
auto result = var1;
Как получить то, что я ожидал?
Объявите новую переменную как ссылку с
auto & result = fn2(var1, var2);
Если вы создаете для C ++ 14 или более позднего стандарта, decltype
можно использовать для отслеживания категории значений возвращаемого типа, lvalue ссылка , чтобы сохранить ссылка.
decltype(auto) result = fn2(var1, var2);
1 Gory details . Обратите внимание, что он использует те же правила удержания, что и шаблоны. Зачем повторяться?
2 Больше не верно . Я должен знать лучше, чем пренебрегать сначала проверкой у Херба Саттера или Скотта Мейерса.