¿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?