Пока шаблоны имеют только одно определение (например, у вас есть только одна единица перевода), оно четко определено. Статические члены инициализируются в порядке, в котором специализации шаблона создаются в контекстах, которые требуют определения элемента статических данных . Из §14.7.1 / 1 [temp.inst] стандарта C ++ 03 (выделено мое):
Если специализация шаблона класса не была явно создана (14.7.2) или явно специализирована (14.7.3), специализация шаблона класса создается неявно, когда на специализацию ссылаются в контексте, который требует полностью определенного типа объекта или когда полнота типа класса влияет на семантику программы. Неявная реализация специализации шаблона класса вызывает неявную реализацию объявлений, но не определений или аргументов по умолчанию, функций-членов класса, классов-членов, статических членов-данных и шаблонов элементов; и это вызывает неявную реализацию определений членских анонимных союзов. Если элемент шаблона класса или шаблон элемента не был явно создан или явно специализирован, специализация члена создается неявно, когда на специализацию ссылаются в контексте, который требует определения элемента; в частности, инициализация (и любые связанные побочные эффекты) элемента статических данных не происходит, если сам элемент статических данных не используется таким образом, который требует определения элемента статических данных.
§14.7.1 / 7 также гласит:
Неявное создание экземпляра шаблона класса не приводит к неявному созданию каких-либо статических членов-членов этого класса.
Однако все становится сложнее, когда у вас есть несколько единиц перевода, которые определяют шаблон. § 3.2 / 5 [basic.def.odr] гласит:
Может быть несколько определений типа класса (раздел 9), типа перечисления (7.2), встроенной функции с внешней связью (7.1.2), шаблона класса (раздел 14), шаблона нестатической функции (14.5). .5), статический член данных шаблона класса (14.5.1.3), функция-член шаблона класса (14.5.1.1) или специализация шаблона, для которого некоторые параметры шаблона не указаны (14.7, 14.5.4) в программе при условии, что каждое определение появляется в отдельной единице перевода, и при условии, что определения удовлетворяют следующим требованиям. Если такая сущность с именем D определена более чем в одной единице перевода, то
(список условий ...)
Если определения D удовлетворяют всем этим требованиям, то программа должна вести себя так, как если бы было одно определение D. Если определения D не удовлетворяют этим требованиям, то поведение не определено.
Обратите внимание, что стандарт не определяет , какое определение принимается за единственное определение, только то, что выбрано некоторое определение . Таким образом, если несколько модулей перевода создают шаблоны в разных порядках, нет никакой гарантии, какой будет порядок инициализации.