file_2.cpp
#include "my_functions.h"
foo(11);
Правильно ли я понимаю, что линковщик выбирает любое инстанцирование шаблонной функции и вставляет только его в исполняемый модуль?
Для шаблонных классов работает также?
Ну формально это просто условно такой linkage
Спасибо
нет, это уб
все там нормально
ага, я почему-то думал что там определение а не инстанциирование
если честно до конца не понял вопрос, типо там же один и тот же тип, одно инстанцирование, не?
нет, там два translation unit
ну да если в разных потоках компилирует, 2 раза инстанцирует, но всё ещё в чем проблема то?
один раз инстанциируется
на два TU?
ну да
пора объяснять полностью что происходит. Итак, компилятор видит шаблон, видит что его нужно инстанцировать с T= int, грубо говоря пишет функцию inline void foo(int v) { }, далее т.к. это inline он в каждую единицу трансляции, которая использует функцию, подставляет static void foo(int v), тык? или че то не так
зачем эти типа inline, без типа, и прочее? Как происходит инстанциирование написано в стандарте
чтобы не читать стандарт
Инстанцируется в каждом TU, где необходимо
http://eel.is/c++draft/temp.inst#5.sentence-1
про ту тут ничего нет
инстанциация в другом TU не делает ее доступной в нашем TU
Каждый .cpp компилируется отдельно и не знает ничего про существование каких-то других. Так что да, в каждом будет своё инстанцирование
если бы я был компилятором, то создавал бы какой то пул проинстанцированных версий шаблонов
для каждого TU: 1) компилятор видит шаблон 2) компилятор видит вызов 3) компилятор не находит определение 4) компилятор генерирует определение для вызова (2) из шаблона (1)
не ну типа какое то дерево там все такое и у каждого шаблона списочек че уже построено для него... грубо говоря
компиляция может идти на разных хостах
А как же? Что отрицаем - раздельную компиляцию каждого .cpp или тот факт, что инстанцирует компилятор, а не линкер?
TU не знают друг про друга до 8 фазы http://eel.is/c++draft/lex.phases#1.8
Обсуждают сегодня