Puede confiar en esto. El ODR (Una definición de regla) dice en 3.2/5
en la Norma, donde D
representa la plantilla de función no estático (tipo de letra cursiva por mí)
Si D es una plantilla, y se define en más de una traducción unidad, los últimos cuatro requisitos de la lista anterior se aplicarán a los nombres del ámbito adjunto de la plantilla utilizado en la definición de la plantilla (14.6.3), y también a los nombres dependientes en el momento de la creación de instancias (14.6.2).Si las definiciones de D satisfacen todos estos requisitos, entonces el programa se comportará como si hubiera una sola definición de D. Si las definiciones de D no satisfacen estos requisitos, entonces el comportamiento no está definido.
De los últimos cuatro requisitos, los dos más importantes son aproximadamente
- cada definición de D consistirá en la misma secuencia de tokens
- nombres en cada definición se refieren a las mismas cosas ("entidades")
Editar
Me imagino que esto por sí solo no es suficiente para garantizar que sus variables estáticas en las diferentes instancias sean todas iguales. Lo anterior solo garantiza que las múltiples definiciones de la plantilla son válidas. No dice algo sobre las especializaciones generadas a partir de él.
Esto es donde vinculación patadas en. Si el nombre de una especialización de plantilla de función (que es una función) tiene enlazado externo (3.5/4
), entonces un nombre que se refiere a una especialización, se refiere a la misma función. Para una plantilla declarada estática, las funciones creadas a partir de ella tienen una vinculación interna, debido a
Las entidades generadas a partir de una plantilla con vinculación interna son distintas de todas las entidades generadas en otras unidades de traducción. -- 14/4
Un nombre que tiene alcance de espacio de nombres (3.3.6) tiene enlace interno si es el nombre de [...] un objeto, de referencia, función o plantilla de función que es explícitamente declararon estática -- 3.5/3
Si la plantilla de función no se declaró con estática, entonces tiene una vinculación externa (que, dicho sea de paso, también es la razón por la que tenemos que seguir la ODR en absoluto. De lo contrario, ¡D
no se definiría de forma múltiple!). Esto se puede derivar de 14/4
(junto con 3.5/3
)
una plantilla de función no miembro puede tener enlace interno; cualquier otro nombre de plantilla tendrá un enlace externo. -- 14/4
.
Por último, llegamos a la conclusión de que una especialización de plantilla de función genera a partir de una plantilla de función con enlace externo en sí tiene enlazado externo por 3.5/4
:
Un nombre que tenga una cobertura de espacio de nombres tiene enlazado externo si es el nombre de [...] una función, a menos que tenga vinculación interna -- 3.5/4
Y cuando se ha enlazado interno se explica por 3.5/3
para funciones proporcionada por explícita especializaciones, y 14/4
para especializaciones generadas (instancias de plantilla). Como el nombre de su plantilla tiene enlaces externos, todas sus especializaciones tienen enlaces externos: si utiliza su nombre (incAndShow<T>
) desde diferentes unidades de traducción, se referirán a las mismas funciones, lo que significa que sus objetos estáticos serán los mismos en cada ocasión.
+1 Buena pregunta. Ahora estoy implementando algo que * "confíe en esta característica" *. – Nawaz