auto a = new int[0];
Selon [basic.compound.3] , la valeur stockée dans a
doit ê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é int
construit. 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 a
comme 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 delete
ce 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 a
est un pointeur passé la fin, alors il est considéré comme pointant vers l'élément hypothétique à l'index 0
d'un tableau sans éléments. L'ajout de l'entier j
à a
n'est défini que lorsque 0≤0+j≤n
, où n
est la taille du tableau. Dans notre cas, n
est nul, donc la somme a+j
n'est définie que lorsque j
est 0
. En particulier, l'ajout 1
n'est pas défini.
Si a
est 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).