Darauf können Sie sich verlassen. Die ODR (One Definition Rule) sagt bei 3.2/5
im Standard, wo D
steht für die nicht-statische Funktion Vorlage (Kursivguß von mir)
Wenn D eine Vorlage und ist in mehr als eine Übersetzung definiert Einheit, dann gelten die letzten vier Anforderungen aus der obigen Liste für Namen aus dem umschließenden Gültigkeitsbereich der Vorlage, der in der Vorlagendefinition (14.6.3) verwendet wird, sowie für abhängige Namen zum Zeitpunkt der Instanziierung (14.6.2).Wenn die Definitionen von D alle diese Anforderungen erfüllen, dann muss sich das Programm so verhalten, als gäbe es eine einzige Definition von D. Wenn die Definitionen von D diese Anforderungen nicht erfüllen, ist das Verhalten undefiniert.
Von den letzten vier Anforderungen, die beiden wichtigsten sind rund
- jede Definition von D der gleichen Folge von Token
- Namen in jeder Definition bestehen gelten die gleichen Dinge beziehen soll ("Entitäten")
bearbeiten
Ich denke, dass dies alleine nicht ausreicht, um zu garantieren, dass Ihre statischen Variablen in den verschiedenen Instanziierungen alle gleich sind. Das obige garantiert nur, dass die mehreren Definitionen der Vorlage gültig sind. Es sagt nichts über die Spezialisierungen aus, die daraus generiert werden. Diese
ist, wo Gestänge Kicks in. Wenn der Name einer Funktion Template-Spezialisierung (die eine Funktion ist) weist Außengestänge (3.5/4
), dann wird ein Name, bezieht sich auf die gleiche Funktion auf eine solche Spezialisierung bezieht. Für eine Vorlage, die als statisch deklariert wurde, haben die von ihr instanziierten Funktionen interne Verknüpfungen, da
Entitäten, die aus einer Vorlage mit interner Verknüpfung generiert werden, sich von allen in anderen Übersetzungseinheiten generierten Entitäten unterscheiden. -- 14/4
einem Namen Namespacebereich (3.3.6) hat interne Bindung, wenn er den Namen [...] ein Objekt, Referenz, Funktion oder Funktionsschablone, die
explizit deklariert statische -- 3.5/3
ist, Wenn die Funktionsvorlage nicht mit statisch deklariert wurde, dann hat sie eine externe Verknüpfung (das ist übrigens auch der Grund, dass wir dem ODR überhaupt folgen müssen. Ansonsten wäre nicht mehrfach definiert!). Dies kann von
14/4
(zusammen mit
3.5/3
) abgeleitet werden
ein Drittfunktionsschablone interne Bindung haben können; jeder andere Vorlagenname muss eine externe Verknüpfung haben. -- 14/4
.
Schließlich kommen wir zu dem Schluss, dass eine Funktion Vorlage Spezialisierung aus einer Funktionsvorlage erzeugt mit externer Bindung hat mir externe Bindung von 3.5/4
:
Ein Name Namespacebereich aufweist, hat eine externe Bindung, wenn es der Name [...] eine Funktion, es sei denn, es interne Bindung -- 3.5/4
hat Und wenn es interne Bindung von 3.5/3
für Funktionen erklärt wurde durch explizite bereitgestellt Spezialisierungen und 14/4
für generierte Spezialisierungen (Template-Instanziierungen). Da Ihr Vorlagenname eine externe Verknüpfung hat, haben alle Ihre Spezialisierungen eine externe Verknüpfung: Wenn Sie ihren Namen (incAndShow<T>
) aus verschiedenen Übersetzungseinheiten verwenden, beziehen sie sich auf die gleichen Funktionen, was bedeutet, dass Ihre statischen Objekte bei jeder Gelegenheit gleich sind.
+1 Gute Frage.Im Moment implementiere ich etwas, das * auf diese Funktion angewiesen ist *. – Nawaz