56 votes

L'initialisation implique-t-elle une conversion de valeur en valeur? Est-ce que `int x = x;` UB?

La norme C++ contient un semi-exemple célèbre de "surprenant" recherche d'un nom dans 3.3.2, Point de "déclaration":

int x = x;

Ce initialise x avec lui-même, qui (être un type primitif) est initialisée et a donc une valeur indéterminée (en supposant que c'est une variable automatique).

Est-ce réellement un comportement indéterminé?

Selon 4.1 "Lvalue-à-rvalue de conversion", il n'est pas le comportement d'effectuer des lvalue-à-rvalue de conversion sur une valeur non initialisée. Ne le de droite x subir cette conversion? Si c'est le cas, l'exemple fait avoir un comportement indéterminé?

7voto

Une conversion implicite de la séquence d'une expression e type T est défini comme étant l'équivalent de la déclaration suivante, à l'aide de t comme le résultat de la conversion (modulo la valeur de la catégorie, qui sera définie en fonction du T), 4p3 et 4p6

T t = e;

L'effet de la conversion implicite est la même que l'exécution de la déclaration et l'initialisation, puis en utilisant la variable temporaire comme le résultat de la conversion.

À l'alinéa 4, de la conversion d'une expression d'un type donne toujours des expressions avec une propriété spécifique. Par exemple, la conversion de 0 de int* donne une valeur de pointeur null, et pas seulement d'un arbitraire de la valeur du pointeur. La valeur de la catégorie de trop est une propriété spécifique de l'expression, et son résultat est défini comme suit

Le résultat est une lvalue si T est une lvalue type de référence ou référence rvalue pour la fonction type (8.3.2), un xvalue si T est une rvalue reference type d'objet, et un prvalue autrement.

Donc, nous savons que, en int t = e;, le résultat de la conversion de la séquence est un prvalue, car int est un non-type de référence. Donc, si nous fournir un glvalue, nous sommes dans le besoin évident d'une conversion. 3.10p2 précise en outre que, pour ne laisser aucun doute

Chaque fois qu'un glvalue apparaît dans un contexte où une prvalue est prévu, la glvalue est converti en prvalue; voir 4.1, 4.2 et 4.3.

-3voto

Arpit Points 4070

À Partir De C++ Primer :

"Les Variables de type définie à l'intérieur d'une fonction ne sont pas initialisées. La valeur d'une variable non initialisée de type n'est pas défini (§ 2.1.2, p. 36). C'est une erreur to copy ou autrement, try to access la valeur d'une variable dont la valeur est undefined."

Après une page il est dit que cette erreur n'est pas requis par un compilateur de détecter.

Ce code fonctionne mais en donnant garabage sur devC++(mingw3.1(c++11 indicateur activé)):

int main()
{
    int x=x;
    cout<<x;
}

-4voto

chenming Points 9

Ce n'est pas un comportement indéfini. Vous ne connaissez simplement pas ses valeurs spécifiques, car il n'y a pas d'initialisation. Si la variable est globale et de type intégré, le compilateur la mettra initialisée à la bonne valeur. Si la variable est locale pour que le compilateur ne l'initialise pas, toutes les variables sont donc initialisées par vous-même, ne comptez pas sur le compilateur.

-5voto

ob. Points 307

Le comportement n'est pas indéfini. La variable est non initialisée et reste avec n'importe quelle valeur aléatoire. Les valeurs non initialisées démarrent. Un exemple tiré du costume de clan'g:

 int test7b(int y) {
  int x = x; // expected-note{{variable 'x' is declared here}}
  if (y)
    x = 1;
  // Warn with "may be uninitialized" here (not "is sometimes uninitialized"),
  // since the self-initialization is intended to suppress a -Wuninitialized
  // warning.
  return x; // expected-warning{{variable 'x' may be uninitialized when used here}}
}
 

Que vous pouvez trouver explicitement dans les tests clang / test / Sema / uninit-variables.c pour ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X