Re: При выводе типа функции теряется ссылка.
От: rg45 СССР  
Дата: 31.05.12 21:10
Оценка: 2 (1)
Здравствуйте, 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!
}


Если нужно, все-таки, чтобы параметр передавался по ссылке, ты этого можешь добиться различными способами: явно указать тип шаблонного параметра при вызове функции, использовать ссылку при объявлении формального параметра шаблонной функции, определить несколько перегрузок одноименной шаблонной функции, и т.д. в зависимости от задачи. Главное, что при этом ты никому не подложишь "сюрпризов".
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.