Potete fidarvi di questo. L'ODR (One Rule Definition) dice alla 3.2/5
nello Standard, dove D
sta per la funzione di modello non statico (di carattere corsivo da me)
Se D è un modello, ed è definito in più di una traduzione unità, quindi gli ultimi quattro requisiti dell'elenco sopra si applicano ai nomi dall'ambito di inclusione del modello utilizzato nella definizione del modello (14.6.3), e anche ai nomi dipendenti nel punto di istanziazione (14.6.2).Se le definizioni di D soddisfano tutti questi requisiti, il programma si comporterà come se esistesse un'unica definizione di D. Se le definizioni di D non soddisfano questi requisiti, il comportamento non è definito.
degli ultimi quattro requisiti, i due più importanti sono approssimativamente
- ogni definizione di D è composto della stessa sequenza di token
- nomi in ogni definizione fanno riferimento alle stesse cose ("entità")
Modifica
Immagino che questo da solo non sia sufficiente per garantire che le variabili statiche nelle diverse istanze siano tutte uguali. Quanto sopra garantisce solo che le molteplici definizioni del modello siano valide. Non dice qualcosa sulle specializzazioni generate da esso.
Questo è dove linkage calci. Se il nome di una specializzazione di modello di funzione (che è funzione) ha linkage esterno (3.5/4
), quindi un nome che si riferisce a tale specializzazione si riferisce alla stessa funzione. Per un modello che è stato dichiarato statico, funzioni esemplificate da essa hanno collegamento interno, a causa della
entità generate da un modello di collegamento interno sono distinti da tutte le entità generate in altre unità di traduzione. -- 14/4
Un nome avente namespace portata (3.3.6) ha il collegamento interno se è il nome di [...] un oggetto, di riferimento, la funzione o modello di funzione che è esplicitamente dichiarate static -- 3.5/3
Se il template della funzione non è stato dichiarato con static, allora ha un link extern (che, a proposito, è anche la ragione per cui dobbiamo seguire l'ODR del tutto, altrimenti, D
non sarebbe affatto definito per moltiplica!). Questo può essere derivato da 14/4
(insieme con 3.5/3
)
Un modello di funzione non-membro può disporre di collegamento interno; qualsiasi altro nome di modello deve avere un collegamento esterno. -- 14/4
.
Infine, arriviamo alla conclusione che un modello di funzione specializzazione generato da un modello di funzione con linkage esterno sé ha linkage esterno 3.5/4
:
Un nome avente portata namespace ha linkage esterno se è il nome di [...] una funzione, se non ha il collegamento interno -- 3.5/4
E quando si ha il collegamento interno è stato spiegato da 3.5/3
per le funzioni fornite dal esplicito specializzazioni e 14/4
per le specializzazioni generate (istanze del modello). Poiché il nome del tuo modello ha un collegamento esterno, tutte le tue specializzazioni hanno un collegamento esterno: se usi il loro nome (incAndShow<T>
) da diverse unità di traduzione, faranno riferimento alle stesse funzioni, il che significa che gli oggetti statici saranno gli stessi in ogni occasione.
+1 Buona domanda.Ora ora sto implementando qualcosa che * "si basa su questa funzione" *. – Nawaz