Это так, но только если вы объявите 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
и заставить код скомпилироваться? ». Лучший ответ, который у меня есть для вас, заключается в том, что это будет несовместимо с поведением разрешения перегрузки, когда аргумент не является целочисленной константой.