auto a = new int[0];
De acordo com [basic.compound.3] , o valor armazenado em a
deve 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 int
construí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 a
como 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 a
for um ponteiro passado-final, é considerado apontar para o elemento hipotético no índice 0
de uma matriz sem elementos. Adicionar o número inteiro j
a 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 a
for 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 a
como 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.
a
com certeza (certamente não pode desreferê-lo).