Здравствуйте, rg45, Вы писали:
R>Мне кажется, что сейчас твое внимание сконцентрировано на конкретном случае и это мешает тебе рассмотреть другие возможные варианты. Допустим, все реализовано как ты хочешь: в точке использования компилятор видит только лишь объявление основного шаблона и шьет такой код, который позволяет линкеру подшить нужную специализацию в точку вызова.
R>Но что если после этого программист решает переместить определение основного шаблона в заголовок? Тогда, после обработки сопроцессором всех директив компилятор получит такой код:
R>R>template<class T>
R>void f(T t)
R>{
R> // Do smth with t
R>}
R>void fi(int x)
R>{
R> f(x);
R>}
R>
Вот когда он это сделает то ситуация уже другая. Тут есть что инстанцировать. До этого было только объявление без дефолтной реализации, вообще без какой либо реализации совсем.
R>Как в точке вызова компилятор должен понять, что здесь ему не нужно инстанцировать основной шаблон? Как быть с неявным инстанцированием, которое обеспечивает именно компилятор — отменяем?
В предыдущем варианте небыло ни строчки про то что надо что-либо инстанцировать, только объявление.
R>Второй момент: что если это не int, а какой-то сложный тип (например, использующий наследование) под который подходят сразу несколько специализаций, которые к тому же и не видны в данной точке? Что у нас с будет с overload resolution в твоем подходе? Не перекладывать же эту работу на линкер?
В чем собственно разница? Всё должно работать единообразно, но это не про стандарт c++