Учитывая auto
, который объявлен как не-ссылка, поэтому мы имеем дело с передачей по значению.И auto
следует правилам вычет аргументов шаблона ;ссылочная часть int&
будет игнорироваться, тогда выводимый тип будет int
.
. Вместо этого вы можете использовать decltype(auto)
(начиная с C ++ 14).
типом является decltype(e)
, где e
является инициализатором.
template <typename T>
decltype(auto) foo(T&& o) { // no sample code is complete without a foo
return o.get();
}
Тип возвращаемого значения выводится как decltype(o.get())
и в соответствии с правилом decltype
,
, если категория значения выражения lvalue, тогда decltype дает T&
;
c.get()
, возвращает int&
,который является lvalue, тогда мы получаем тип возврата int&
вместо int
.
Кстати: обратите внимание, что если o
все еще передается по значению, возвращаемая ссылка будет зависать.