¿Se puede usar std :: launder para convertir un puntero de objeto en su puntero de matriz envolvente?

El borrador actual del estándar (y presumiblemente C ++ 17) dice en [basic.compound / 4]:

[Nota: un objeto de matriz y su primer elemento no son interconvertibles por puntero, aunque tengan la misma dirección. - nota final]

Así que un puntero a un objeto no puede serreinterpret_cast 'd para obtener su puntero de matriz envolvente.

Ahora haystd::launder, [ptr.launder / 1]:

template<class T> [[nodiscard]] constexpr T* launder(T* p) noexcept;

Requires:p representa la dirección A de un byte en la memoria. Un objeto X que está dentro de su vida útil y cuyo tipo es similar a T se encuentra en la dirección A. Todos los bytes de almacenamiento que serían accesibles a través del resultado son accesibles a través dep (vea abajo)

Y la definición deaccesibl es en [ptr.launder / 3]:

Remarks: una invocación de esta función puede usarse en una expresión constante central siempre que el valor de su argumento pueda usarse en una expresión constante central. Se puede acceder a un byte de almacenamiento a través de un valor de puntero que apunta a un objeto Y si está dentro del almacenamiento ocupado por Y, un objeto que es interconvertible por puntero con Y, o la objeto de matriz que encierra inmediatamente si Y es un elemento de matriz. El programa está mal formado si T es un tipo de función o cv void.

Ahora, a primera vista, parece questd::launder se puede usar para hacer la conversión mencionada anteriormente, debido a la parte que he puesto énfasis.

Pero. Sip apunta a un objeto de una matriz, los bytes de la matriz sonaccesibl de acuerdo con esta definición (aunquep no es puntero-interconvertible a array-puntero), al igual que el resultado del lavado. Entonces, parece que la definición no dice nada sobre este tema.

Por lo que puedestd::launder se utilizará para convertir un puntero de objeto en su puntero de matriz envolvente?

Respuestas a la pregunta(2)

Su respuesta a la pregunta