почему первый код не работает; почему это связано с левым / правым значением;
Для 1-го случая T
будет выведено как int
, тогда тип параметра будет int &
, который является lvalue-ссылкой на неконстантный. И 5
является значением rvalue, которое не может быть привязано к lvalue-ссылке на неконстантное значение, и тогда вызов не удался.
Для второго случая тип параметра функции - const int &
, т. Е. Lvalue-ссылка на const, которая может связываться с rvalue, как 5
.
почему T
в 3-м не const int
Вывод аргумента шаблона не будет добавлять const
, если аргумент не относится к типу const
. 5
имеет тип int
(и это r-значение), но его тип не const int
.
С другой стороны, у нас есть ссылка для переадресации для работы с lvalues / rvalues. например, * * одна тысяча тридцать две
template <typename T>
void func(T &&) {}
int a;
const int b;
func(a); // T -> int&; parameter type -> int&
func(b); // T -> const int&; parameter type -> const int&
func(5); // Fine. T -> int; paramter type -> int&&