Uso de std :: launder para "validar" el valor del puntero no "puntero al objeto" desde C ++ 17

De acuerdo a estoresponder, desde C ++ 17, incluso si un puntero tiene la dirección correcta y el tipo correcto de desreferenciación puede causarcomportamiento indefinido.

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

La razón es que el valor del puntero dep1+1 esun puntero pasado-fin de un objeto. ¿Puede este ejemplo volver al comportamiento definido usandostd::launder:

 *std::launder(p1+1)=10; // still UB?  

En segundo lugar, ¿también sería útil en el siguiente caso?

alignas(int) unsigned char buffer[3*sizeof(int)];
auto pi = new (buffer) int{};
auto pc = reinterpret_cast<unsigned char*>(pi);//not a "pointer to" an element of buffer 
                                               //since buffer[0] and *pc 
                                               //are not pointer interconvertible
//pc+2*sizeof(int) would be UB
auto pc_valid = std::launder(pc) //pc_valid is a pointer to an element of buffer
auto pc_valid2 = pc_valid+2*sizeof(int); //not UB thanks to std::launder
auto pi2 = new (pc_valid2) int{};

Respuestas a la pregunta(1)

Su respuesta a la pregunta