Perfect Forwarding в C ++ 03

Если у вас есть эта функция

template<typename T> f(T&);

И затем попробуйте вызвать ее с помощью, скажем, значения r, например

f(1);

Why is ' t T просто выводится как const int, делая аргумент const int & и, следовательно, привязываемым к r-значению?

24
задан cHao 17 November 2011 в 20:25
поделиться

1 ответ

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

1
ответ дан 29 November 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: