Usando std :: washder para obter um ponteiro para um membro do objeto ativo de um ponteiro para um objeto inativo?

Esta pergunta segue esta1

Vamos considerar este código de exemplo:

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?
    }
  };

E seshort_str não é o membro ativo que desreferencia o ponteiro semstd::launder seria UB. Vamos considerar que a ABI está bem especificada e que sabemos que size_r [7] está no mesmo endereço que short_str [15]. Fazstd::launder(short_str+15) retornar um ponteiro parasize_r[7] quandoshort_str não é o membro ativo do sindicato?

Nota: Eu acho que é esse o caso, porque[ptr.launder] / 3

Um byte de armazenamento é alcançável por meio de um valor de ponteiro que aponta para um objeto Y, se estiver dentro do armazenamento ocupado por Y, um objeto que é intercambiável por ponteiro com Y ou o objeto de matriz de fechamento imediato, se Y for um elemento da matriz.

questionAnswers(1)

yourAnswerToTheQuestion