auto a = new int[0];
De acordo com [basic.compound.3] , o valor armazenado em adeve ser um dos seguintes:
- Um ponteiro para um objeto (do tipo
int)
- Um ponteiro após o final de um objeto
- Nulo
- Inválido
Podemos descartar a primeira possibilidade, pois não havia objetos do tipo intconstruídos. A terceira possibilidade é descartada, pois o C ++ exige que um ponteiro não nulo seja retornado (consulte [basic.stc.dynamic.allocation.2] ). Assim, temos duas possibilidades: um ponteiro após o final de um objeto ou um ponteiro inválido.
Eu estaria inclinado a ver acomo um ponteiro do passado, mas não tenho uma referência respeitável para estabelecer isso definitivamente. (Há, no entanto, uma forte implicação disso em [basic.stc] , vendo como você pode usardelete esse ponteiro.) Portanto, vou apresentar as duas possibilidades nesta resposta.
Entre a inicialização e a exclusão da cópia, você pode ler o ponteiro em a + 1?
O comportamento é indefinido, conforme ditado por [expr.add.4] , independentemente de qual possibilidade acima se aplique.
Se afor um ponteiro passado-final, é considerado apontar para o elemento hipotético no índice 0de uma matriz sem elementos. Adicionar o número inteiro ja aé definido apenas quando 0≤0+j≤n, onde né o tamanho da matriz. No nosso caso, né zero, então a soma a+jé definida apenas quando jé 0. Em particular, a adição 1é indefinida.
Se afor inválido, cairemos claramente em "Caso contrário, o comportamento será indefinido". (Não é de surpreender que os casos definidos abranjam apenas valores válidos de ponteiro.)
Além disso, o idioma permite que o compilador seja definido acomo nullptr?
Não. Do [basic.stc.dynamic.allocation.2] mencionado acima : "Se a solicitação for bem-sucedida, o valor retornado por uma função de alocação substituível é um valor de ponteiro não nulo" . Há também uma nota de rodapé destacando que o C ++ (mas não C) requer um ponteiro não nulo em resposta a uma solicitação zero.
acom certeza (certamente não pode desreferê-lo).