Re[7]: Вопрос знатокам
От: rg45 СССР  
Дата: 03.04.23 21:26
Оценка: +1
Здравствуйте, kov_serg, Вы писали:

_>С точки зрения компилятора, я не инстанцирую класс, а вызываю функцию. Что явно указано в коде. Нахрена запрещать определение реализации дальше по коду. Почему это не эквивалентно костылю с предварительным насильным объявлением сигнатуры функции.


Мне кажется, что сейчас твое внимание сконцентрировано на конкретном случае и это мешает тебе рассмотреть другие возможные варианты. Допустим, все реализовано как ты хочешь: в точке использования компилятор видит только лишь объявление основного шаблона и шьет такой код, который позволяет линкеру подшить нужную специализацию в точку вызова. Но что если после этого программист решает переместить определение основного шаблона в заголовок? Тогда, после обработки сопроцессором всех директив компилятор получит такой код:

template<class T>
void f(T t)
{
  // Do smth with t
}

void fi(int x)
{
  f(x);
}


Поведение программы должно измениться или нет? Наверное, нет, иначе это будет действительно странное поведение. Но как тогда в точке вызова компилятор должен понять, что здесь ему не нужно инстанцировать основной шаблон? Как быть с неявным инстанцированием, которое обеспечивает именно компилятор — отменяем?

Второй момент: что если это не int, а какой-то сложный тип (например, использующий наследование) под который подходят сразу несколько специализаций, которые к тому же и не видны в данной точке? Что у нас с будет с overload resolution в твоем подходе? Не перекладывать же эту работу на линкер?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 03.04.2023 21:40 rg45 . Предыдущая версия . Еще …
Отредактировано 03.04.2023 21:29 rg45 . Предыдущая версия .
Отредактировано 03.04.2023 21:27 rg45 . Предыдущая версия .
Отредактировано 03.04.2023 21:27 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.