Информация об изменениях

Сообщение Re[7]: Вопрос знатокам от 03.04.2023 21:26

Изменено 03.04.2023 21:27 rg45

Re[7]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

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


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

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

void fi(int x)
{
f(x);
}
[cpp]

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

Второй момент: что если это не int, а какой-то сложный тип (например, использующий наследование) под который подходят сразу несколько специализаций, которые к тому же и не видны в данной точке? Что у нас с будет с overload resolution в твоем подходе?
Re[7]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

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


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

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

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


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

Второй момент: что если это не int, а какой-то сложный тип (например, использующий наследование) под который подходят сразу несколько специализаций, которые к тому же и не видны в данной точке? Что у нас с будет с overload resolution в твоем подходе?