Объясните, пожалуйста, что не так с этим кодом?
Необычное поведение заключается в том, что f3 работает, когда неявно выводится, но не работает, когда принудительно специализируется.
template<typename T>
void f1(T x) {}
template<typename T>
void f2(T& x) {}
template<typename T>
void f3(T&& x) {}
int main()
{
int x = 0;
f1(x); // ok
f2(x); // ok
f3(x); // ok
f1<int>(x); // ok
f2<int>(x); // ok
f3<int>(x); // error
}
VS2017.Сообщение компилятора:
ошибка C2664: «void f3 (T &&)»: невозможно преобразовать аргумент 1 из «int» в «T &&»
Я думал, что делаю то же самое, явно указав int .И единственное отличие в том, что вычет в этом случае f3(x);
был сделан компилятором, а в этом f3<int>(x);
мной.