Um ponteiro com o endereço e o tipo corretos ainda é sempre um ponteiro válido desde o C ++ 17?

(Em referência aesta pergunta e resposta.)

Antes do padrão C ++ 17, a seguinte frase foi incluída no[basic.compound] / 3:

Se um objeto do tipo T estiver localizado no endereço A, diz-se que um ponteiro do tipo cv T *, cujo valor é o endereço A, aponte para esse objeto, independentemente de como o valor foi obtido.

Mas desde C ++ 17, essa frase tem sidoremovido.

Por exemplo, acredito que esta frase tenha definido esse código de exemplo e que, desde C ++ 17, esse é um comportamento indefinido:

 alignas(int) unsigned char buffer[2*sizeof(int)];
 auto p1=new(buffer) int{};
 auto p2=new(p1+1) int{};
 *(p1+1)=10;

Antes do C ++ 17,p1+1 mantém o endereço para*p2 e tem o tipo certo, então*(p1+1) é um ponteiro para*p2. Em C ++ 17p1+1 é umponteiro passado-o-fim, então não é umponteiro para objeto e acredito que não é dereferencable.

Esta interpretação desta modificação da norma está correta ou existem outras regras que compensam a exclusão da sentença citada?

questionAnswers(3)

yourAnswerToTheQuestion