Point de déclaration
Le point de déclaration d'un nom se situe immédiatement après son déclarateur complet complet et avant son initialisateur... [C++ Standard § 3.3.2/1]
Le compilateur complète la déclaration lorsqu'il en sait assez sur le déclarant.
Le code ci-dessus est égal au code ci-dessous :
int x = 101;
{
int x;
x = x; <------------------// Self assignment, assigns an indeterminate value.
std::cout << x << std::endl;
}
Car, la déclaration de l'intérieur x
complété avant =
(affectation)
int x = x; <--// Now, we have the new `x` which hides the older one,
^ // so it assigns itself to itself
|
+---// Point of declaration,
// here compiler knows everything to declare `x`.
// then declares it.
D'autre part, lorsque nous déclarons des objets complexes, le point de déclaration est plus éloigné. Donc, le comportement est différent.
Par exemple, le code ci-dessous est correct
const int i = 2;
{
int i[i];
^
|
+----// Point of declaration
// compiler has to reach to "]"
// therefore before declaring `i` as an array
// there is just one `i`, the `i` of `const int i=2`
}
Dans le code ci-dessus, le compilateur doit connaître la taille réelle du tableau pour compléter la déclaration, donc le point de déclaration est ]
. Par conséquent, le i
sur [i]
est l'extérieur i
car la déclaration de l i
de int i[...
n'est pas encore terminé. Ainsi, il déclare un tableau avec 2
éléments ( int i[2];
).
Cet exemple montre également le point de déclaration d'un énumérateur.
const int x = 12;
{
enum { x = x };
^
|
+---// Point of declaration
// compiler has to reach to "}" then
// there is just one `x`, the `x` of `const int x=12`
}
L'énumérateur x
est initialisé avec la valeur de la constante x
à savoir 12
.