Вы можете положиться на это. ODR (One Definition Rule) говорит, что в 3.2/5
в Стандарте, где D
обозначает шаблон нестатической функции (скоропись шрифтов мной)
Если D представляет собой шаблон, и определяется в более чем один перевод единица, то последние четыре требования из приведенного выше списка применяются к именам из области охвата шаблона, используемой в определении шаблона (14.6.3), а также к зависимым именам в момент создания экземпляра (14.6.2).Если определения D удовлетворяют всем этим требованиям, то программа должна вести себя так, как если бы было одно определение D. Если определения D не удовлетворяют этим требованиям, то поведение не определено.
Из последних четырех требований, два наиболее важные примерно
- каждого определения D состоит из одной и той же последовательности лексем
- имен в каждом определении, должны относиться к тем же вещам ("сущности")
Редактировать
Я полагаю, что этого недостаточно, чтобы гарантировать, что ваши статические переменные в разных экземплярах все одинаковы. Вышеупомянутое гарантирует только то, что несколько определений шаблона действительны. Он ничего не говорит о специализациях, созданных из него.
Это где связи умирает. Если имя шаблон функции специализации (которая является функцией) имеет внешнее связывание (3.5/4
), то имя, которое относится к такой специализации относится к одной и той же функции. Для шаблона, который был объявлен статическим, функции, созданные из него, имеют внутреннюю связь, из-за
Объекты, созданные из шаблона с внутренней связью, отличны от всех объектов, сгенерированных в других единицах перевода. -- 14/4
Пространство имен Объем имя, имеющий (3.3.6) имеет внутреннюю связь, если это имя [...] объект, ссылки, функция или шаблон функции, которая явным образом объявлена статическая -- 3.5/3
Если шаблон функции не был объявлен со статикой, то он имеет внешнюю связь (что, кстати, также является причиной того, что мы должны следовать за ODR вообще, иначе D
не будет размножаться вообще!). Это может быть получено из 14/4
(вместе с 3.5/3
)
Шаблон функции не являющегося членом может иметь внутреннюю связь; любое другое имя шаблона должно иметь внешнюю связь. -- 14/4
.
Наконец, мы пришли к выводу, что шаблон функции специализация генерируется из шаблона функции с внешним связыванием имеет себя внешнее связывание с 3.5/4
:
Имени, имеющее область пространства имен имеет внешнее связывание, если оно имя [...] функция, если она не имеет внутренней связи -- 3.5/4
И когда она внутренняя связь объясняется 3.5/3
для функций обеспечивается явным специализации и 14/4
для созданных специализаций (экземпляров шаблонов). Поскольку ваше имя шаблона имеет внешнюю связь, все ваши специализации имеют внешнюю связь: если вы используете свое имя (incAndShow<T>
) из разных единиц перевода, они будут ссылаться на те же функции, что означает, что ваши статические объекты будут одинаковыми в каждом случае.
+1 Хороший вопрос. Теперь я реализую что-то, что «полагается на эту функцию» *. – Nawaz