auto a = new int[0];
Selon [basic.compound.3] , la valeur stockée dans adoit être l'une des suivantes:
- Un pointeur sur un objet (de type
int)
- Un pointeur après la fin d'un objet
- Nul
- Invalide
Nous pouvons exclure la première possibilité car aucun objet de type n'a été intconstruit. La troisième possibilité est exclue car C ++ nécessite le retour d'un pointeur non nul (voir [basic.stc.dynamic.allocation.2] ). Il nous reste donc deux possibilités: un pointeur après la fin d'un objet ou un pointeur invalide.
Je serais enclin à voir acomme un pointeur passé la fin, mais je n'ai pas de référence fiable pour établir définitivement cela. (Il y a, cependant, une forte implication de ceci dans [basic.stc] , voir comment vous pouvez deletece pointeur.) Je vais donc envisager les deux possibilités dans cette réponse.
Entre l'initialisation et la suppression de la copie, êtes-vous autorisé à lire le pointeur sur a + 1?
Le comportement n'est pas défini, comme dicté par [expr.add.4] , quelle que soit la possibilité ci-dessus qui s'applique.
Si aest un pointeur passé la fin, alors il est considéré comme pointant vers l'élément hypothétique à l'index 0d'un tableau sans éléments. L'ajout de l'entier jà an'est défini que lorsque 0≤0+j≤n, où nest la taille du tableau. Dans notre cas, nest nul, donc la somme a+jn'est définie que lorsque jest 0. En particulier, l'ajout 1n'est pas défini.
Si aest invalide, alors nous tombons proprement dans "Sinon, le comportement n'est pas défini". (Sans surprise, les cas définis ne couvrent que des valeurs de pointeur valides.)
En outre, la langue ne permet au compilateur de jeu aà nullptr?
Non. D'après la [basic.stc.dynamic.allocation.2] mentionnée ci-dessus : "Si la demande aboutit, la valeur renvoyée par une fonction d'allocation remplaçable est une valeur de pointeur non nulle" . Il existe également une note de bas de page indiquant que C ++ (mais pas C) nécessite un pointeur non nul en réponse à une demande nulle.
aà coup sûr (vous ne pouvez certainement pas le déréférencer).