Хорошо, я понял, спасибо.
вопрос следует за этимодин
Давайте рассмотрим этот пример кода:
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?
}
};
Еслиshort_str
не является активным членом разыменование указателя безstd::launder
будет UB. Давайте рассмотрим, что ABI правильно указан, и что мы знаем, что size_r [7] находится по тому же адресу, что и short_str [15]. Есть лиstd::launder(short_str+15)
вернуть указатель наsize_r[7]
когдаshort_str
не является активным членом союза?
Nota: Я думаю, что это так, потому что[Ptr.launder] / 3
Байт памяти доступен через значение указателя, которое указывает на объект Y, если он находится внутри хранилища, занятого Y, объект, который взаимозаменяем с указателем Y, или непосредственно включающий объект массива, если Y является элементом массива.