Я бы добавил эти декларации, чтобы они были в безопасности (ну, если я не перегружу их по какой-либо причине). Я не думаю, что закон слишком ясен в этом. Например, у нас есть
[temp.expl.spec]
6 Если шаблон, шаблон элемента или элементесли шаблон класса явно специализирован, то эта специализация должна быть объявлена до первого использования этой специализации, которая может привести к неявной реализации в каждой единице перевода, в которой происходит такое использование;Диагностика не требуется. Если программа не предоставляет определения для явной специализации, и либо специализация используется таким образом, чтобы вызвать неявное создание экземпляра, либо член является функцией виртуального члена, программа не сформирована, диагностика не требуется. Неявная реализация никогда не генерируется для явной специализации, которая объявлена, но не определена.
Что, если я правильно прочитал, означает, что если явная специализация добавлена к main.cpp
, то она должна появиться до main
. Потому что именно здесь может происходить неявная реализация. Абзац не заставляет ваш код выровнять плохо сформированный отчет о недоставке, потому что использование и явная специализация появляются в разных TU. Но это вызывает озабоченность.
С другой стороны, есть этот абзац:
[temp]
7 Шаблон функции, функция-член шаблона класса, шаблон переменной или статический член данных шаблона класса должны быть определены в каждой единице перевода, в которой он создается неявно, если только соответствующая специализация явно не создана в некоторой единице перевода;Диагностика не требуется.
Этот позволяет явно создавать экземпляр в отдельных невидимых TU. Но это не дает возможности для явных специализаций. Я не могу сказать, является ли это намеренным или упущением.
Причина, по которой это работает, скорее всего, связана с тем, как все это реализовано. Когда объявление функции создается неявно, оно генерирует символ, который, как оказалось, соответствует символу, созданному явной специализацией. Совпадение символов означает счастливый компоновщик, поэтому все строится и работает.
Но с точки зрения юриста-языка, я думаю, что мы можем назвать поведение здесь неопределенным по пропуску. Он не определен просто потому, что стандарт не касается этого. Итак, возвращаясь к своему вступительному заявлению, я бы добавил их, чтобы они были в безопасности, потому что, по крайней мере, после этого место размещения определяется стандартом.