Cette ligne de code peut effectivement apparaître dans plusieurs contextes différents et alghough il se comporte approximativement la même, il existe de petites différences.
Espace De Noms De Champ
// foo.h
static const int i = 0;
'i
"sera visible dans chaque unité de traduction qui comprend l'en-tête. Cependant, à moins que vous avez fait d'utiliser l'adresse de l'objet (par exemple. '&i
'), Je suis assez sûr que le compilateur va traiter 'i
"simplement comme un type de coffre-fort 0
. Lorsque deux ou plus d'unités de traduction prendre le '&i
', puis l'adresse sera différent pour chaque unité de traduction.
// foo.cc
static const int i = 0;
'i
' a une liaison interne, et ne peut donc pas être appelé à partir de l'extérieur de cette unité de traduction. Cependant, à nouveau, sauf si vous utilisez son adresse, il sera plus susceptible d'être traité comme un type-safe 0
.
Une chose est intéressant de souligner, c'est que la déclaration suivante:
const int i1 = 0;
est exactement le même que static const int i = 0
. Une variable dans un espace de noms déclarés avec const
et pas explicitement déclarée en extern
est implicitement statique. Si vous pensez à ce sujet, il était de l'intention du comité C++ pour permettre l' const
variables déclarées dans l'en-tête des fichiers sans avoir toujours besoin de l' static
mot-clé pour éviter la rupture de l'ODR.
Portée De Classe
class A {
public:
static const int i = 0;
};
Dans l'exemple ci-dessus, la norme spécifie explicitement que"i
' n'a pas besoin d'être défini si son adresse n'est pas nécessaire. En d'autres termes, si vous utilisez uniquement 'i
' en tant que type-safe 0 alors le compilateur ne la définit pas. Une différence entre la classe et l'espace de versions, c'est que l'adresse de 'i
"(si utilisé dans deux ou plusieurs unités de traduction) sera la même pour le membre de la classe. Lorsque l'adresse est utilisée, vous devez disposer d'une définition:
// a.h
class A {
public:
static const int i = 0;
};
// a.cc
#include "a.h"
const int A::i; // Definition so that we can take the address