auto a = new int[0];
Secondo [basic.compound.3] , il valore memorizzato in adeve essere uno dei seguenti:
- Un puntatore a un oggetto (di tipo
int)
- Un puntatore oltre la fine di un oggetto
- Nullo
- Non valido
Possiamo escludere la prima possibilità poiché non sono stati intcostruiti oggetti di tipo . La terza possibilità è esclusa poiché C ++ richiede la restituzione di un puntatore non nullo (vedere [basic.stc.dynamic.allocation.2] ). Quindi ci rimangono due possibilità: un puntatore oltre la fine di un oggetto o un puntatore non valido.
Sarei propenso a vederlo acome un puntatore del passato, ma non ho un riferimento affidabile per affermarlo definitivamente. (Vi è, tuttavia, una forte implicazione di ciò in [basic.stc] , vedendo come è possibile deletequesto puntatore.) Quindi intratterrò entrambe le possibilità in questa risposta.
Tra l'inizializzazione e la cancellazione della copia, è consentito leggere il puntatore su a + 1?
Il comportamento non è definito, come dettato da [expr.add.4] , indipendentemente da quale possibilità si applichi sopra.
Se aè un puntatore passato, allora si considera che punti all'ipotetico elemento all'indice 0di un array senza elementi. L'aggiunta del numero intero ja aviene definita solo quando 0≤0+j≤n, dov'è nla dimensione dell'array. Nel nostro caso, nè zero, quindi la somma a+jviene definita solo quando lo jè 0. In particolare, l'aggiunta 1non è definita.
Se anon è valido, cadiamo chiaramente in "Altrimenti, il comportamento non è definito." (Non sorprende che i casi definiti coprano solo valori di puntatore validi.)
Inoltre, non il linguaggio permette al compilatore di serie aa nullptr?
No. Dal summenzionato [basic.stc.dynamic.allocation.2] : "Se la richiesta ha esito positivo, il valore restituito da una funzione di allocazione sostituibile è un valore puntatore non nullo" . C'è anche una nota a piè di pagina che afferma che C ++ (ma non C) richiede un puntatore non nullo in risposta a una richiesta zero.
acon certezza (non puoi certo dereferenziarlo).