Здравствуйте, Went, Вы писали:
W>Здравствуйте. Вопрос, наверное, ламерский, но меня такое очень удивило.
W>Итак, такой код:
W>W>template<typename T>
W>void f(T x)
W>{
W>}
W>void main()
W>{
W> int i = 0;
W> int& ri = i;
W> f(ri);
W>}
W>
W>1. Почему тип T выводится как int, а не как int&?
Тебя же не удивляет, что
T выводится как
int при передаче в эту функцию
i вместо
ri? А между тем, выражения
i и
ri имеют одинаковый тип —
lvalue of int, а значит и результат выведения типов для них одинаков.
Почему сделали так, а не иначе? Ну, вероятно, не захотели брать на себя ответственность за сюрпризы, которые могут случаться при подобных сценариях:
template<typename T>
void f(T x)
{
x = foo(); //T is reference? An outer variable is modified!
}
Если нужно, все-таки, чтобы параметр передавался по ссылке, ты этого можешь добиться различными способами: явно указать тип шаблонного параметра при вызове функции, использовать ссылку при объявлении формального параметра шаблонной функции, определить несколько перегрузок одноименной шаблонной функции, и т.д. в зависимости от задачи. Главное, что при этом ты никому не подложишь "сюрпризов".