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.