Приводит ли вызов foo
в следующем коде к UB?
using vec = std::array<int, 1>;
struct field0 {
vec data;
operator int() {
return data[0];
}
};
union a {
struct {
vec data;
} data;
field0 x;
};
void foo() {
a bar;
std::cin >> bar.data.data[0];
std::cout << bar.x;
}
Согласно стандарту, x
и data
имеют одинаковый адрес, поэтому приведение * 1007 должно быть безопасным * на vec*
. Кроме того, field0
и vec
совместимы с макетом, поэтому можно безопасно проверять data
через x.data
или наоборот.
Однако мы не просто проверяем x.data
, мы вызывать нестатическую c функцию-член x
за пределами его времени жизни (или мы? Я не могу найти причину, по которой должно было начаться x
время жизни), поэтому формально это UB. Это правильно?
Я пытаюсь достичь четко определенной версии общего подхода к полю массива имен, например union a { int data[3]; int x, y, z};
UPD:
К сожалению, при удалении ненужных деталей была потеряна совместимость макета между полем массива и "геттером". Сейчас восстановлено.
Мне нужно будет использовать a
значения для функции, которая принимает int*
, поэтому идти в другом направлении - объявление полей и перегрузка operator[]
- не вариант .