Я думаю, что проблема предшествует вашей теории: C ++ не определяет ABI (двоичный интерфейс приложения).
На самом деле даже C не делает этого, но, будучи библиотекой C просто набором функций (и может быть глобальными переменными), ABI - это просто название самих функций. В зависимости от платформы имена можно каким-то образом искажать, но, поскольку каждый компилятор должен иметь возможность выполнять системную калибровку, все заканчивается тем же соглашением компоновщика операционной системы (в Windows _cdecl
просто приводит к добавлению _
к названию функции.
Но в C ++ есть перегрузка, поэтому требуется более сложная схема искажения.
На сегодняшний день не существует соглашения между производителями компиляторов о том, как такое искажение должно быть сделано.
Технически невозможно скомпилировать статическую библиотеку C ++ и связать ее с OBJ C ++, полученным из другого компилятора. То же самое относится и к DLL.
И поскольку все компиляторы различны даже для скомпилированных перегруженных функций-членов, на самом деле никто не решает проблему шаблонов.
Технически это МОЖЕТ быть предоставлено путем введения перенаправления для каждого параметрического типа и введения таблиц диспетчеризации, но ... это делает шаблонную функцию не отличающейся (с точки зрения диспетчеризации вызовов) от виртуальных функций виртуальных баз, таким образом делая производительность шаблона стать похожим на классическую ООП диспетчеризацию (хотя это может ограничить вздутие кода ... компромисс не всегда очевиден)
В настоящее время, похоже, что производители компиляторов не заинтересованы в согласии с общим стандартом, поскольку он пожертвует всеми различиями в производительности, которые может иметь каждый производитель, с его собственной оптимизацией.