¿Usa std :: launder para obtener un puntero a un miembro de objeto activo desde un puntero a un objeto inactivo?
Esta pregunta sigue a estauno
Consideremos este código de ejemplo:
struct sso
{
union{
struct {
char* ptr;
char size_r[8];
} large_str;
char short_str[16];
};
bool is_short_str() const{
return *std::launder(short_str+15)=='\0'; //UB?
}
};
Sishort_str
no es el miembro activo que hace referencia al puntero sinstd::launder
Sería UB. Consideremos que el ABI está bien especificado y que sabemos que size_r [7] está en la misma dirección que short_str [15]. Hacestd::launder(short_str+15)
devolver un puntero asize_r[7]
cuandoshort_str
¿No es el miembro activo del sindicato?
Nota: Creo que este es el caso porque[ptr.launder] / 3
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 el objeto de matriz que encierra inmediatamente si Y es un elemento de matriz.