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

Respuestas a la pregunta(1)

Su respuesta a la pregunta