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?