О компиляции и конкретизации шаблонов С++

147
28 мая 2021, 17:40

Во всяких учебниках и туториалах прописано, что при конкретизации (создания из трафарета функции или класса конкретной функции или класса с конкретными подставленными типами) шаблона, гарантируется что один и тот же шаблон для определенного типа конкретизируется только один раз, независимо от того, в каких модулях (файлы ли это имеются ввиду???) происходит эта конкретизация. Но как компилятор выстраивает этот процесс конкретизации, если компиляция файлов происходит по отдельности???

Например:

у нас существует файл с определением шаблона, например, функции (для простоты) Пусть он называется template_definition.h

имеются так же файлы template_user_first.cpp и template_user_second.cpp. В оба этих файлв мы подключаем наш шаблон (include template_definition.h), а так же вызываем определенную шаблонную функцию с типом параметра, скажем int (в обеих файлах с одним и тем же типом параметра int, соответственно). Поскольку компилятор обрабатывает файлы по отдельности, то при препроцессинге template_user_first.cpp, он вставляет в него определение шаблона, конкретизирует его для типа параметра int и компилирует получившийся код инстанции шаблона, как часть объектного файла template_user_first.obj. Однако же, когда компилятор приступает к компиляции файла template_user_second.cpp, то он, по идее, забывает о том, что уже конкретизировал шаблон функции типом int и откомпилировал обьектный код.

Из этого размышления следует что шаблон конкретизируется два раза, мало того, если бы происходило так (а так ли это???), то при линковке, линковщик бы встретил одну и ту же функцию, определенную дважды!

Возможно компилятор, при компиляции пачки файлов имеет некий кэш для конкретизаций шаблонов (первое что приходит в голову), но если так, то при раздельной компиляции и линковке существует возможность того, что в финальной слинкованной программе не окажется определения необходимой функции, ведь она была конкретизирована в файле, который не был включен в линковку впоследствии.

В общем, повторяю вопрос после всего описанного: Как в реальности происходит данный процесс компиляции и конкретизации шаблонов?!

Answer 1

Все правильно, компилятор делает по определению функции в каждой из единиц трансляции, а линковщик произвольно выбирает из двух.

гарантируется что один и тот же шаблон для определенного типа конкретизируется только один раз

В отличие от некоторых других языков, в С++ ничего такого не гарантируется. Ситуация, когда определения одной и той же шаблонной функции в разных единицах трансляции отличаются, является Неопределённым Поведением.

READ ALSO
Время жизни переменных в лямбде функции?

Время жизни переменных в лямбде функции?

Время жизни переменных, которые передают в область захвата(в квадратные скобки) лямбды-функции по значению

88
задача на симетричное отображений

задача на симетричное отображений

В общемЕсть задача Так же есть вот такой код размещения '*' Число логически в голове крутится версия проще ( с помощью abs()) Но никак не могу продумать...

129
С++ Возврат из функции по значению

С++ Возврат из функции по значению

Я новичок в С++ 11, поэтому возникают подобные вопросы))

112
Использование свойств в С++

Использование свойств в С++

В С++ для атрибутов класса можно задавать свойства, шаблон определения которых -

92