Если у вас есть эта функция
template<typename T> f(T&);
И затем попробуйте вызвать ее с помощью, скажем, значения r, например
f(1);
Why is ' t T просто выводится как const int, делая аргумент const int & и, следовательно, привязываемым к r-значению?
Да, но только если вы объявите f
как T const &
.
template <typename T> void f(T &);
template <typename T> void g(T const &);
void x() { f(1); } // error: invalid initialization of non-const reference
void y() { g(1); } // no error
И если вы объявите оба f(T &)
и f(T const &)
, будет выбран константный вариант:
template <typename T> void f(T &);
template <typename T> void f(T const &);
void x() { f(1); } // no error, calls f(T const &)
Теперь может быть, вы говорите: «Почему в первом примере генерируется временное значение типа int
для вызова f
, когда оно могло сгенерировать временное типа const int
и скомпилировал код?» Лучший ответ, который у меня есть для вас, заключается в том, что это будет несовместимо с поведением разрешения перегрузки, когда аргумент не является целочисленной константой.