Хорошо, после небольшого почесывания головы, я думаю, что могу объяснить это правильно. Ну, для начала, это Illegal As Heck (tm).
A struct
, определенный в объединении, немного смущает компилятор. Если за struct def следует имя, обычно создается новая переменная типа такой структуры, но C ++ явно запрещает анонимные структуры . Если вы опустите это имя, это может означать две вещи - либо создается анонимный тип структуры, а затем немедленно удаляется (что соответствует предупреждению -Wpedantic
), либо, как кажется, происходит с G CC, он считает, что создание анонимного члена анонимного типа , который является нестандартным расширением:
union alias {
struct { int one; }; // anonymous member of an anonymous type
struct a { int two }; // no member, just def of "struct a"
struct { int three; } b; // named (b) member of type anonymous struct
};
В общем, вы не можете ожидать, что это сработает ... если вы не создадите членов объединения с явными именами типов и членов данных:
struct s { int three; };
union alias {
struct A { int one; };
struct B { int two; };
struct C : s { };
A a;
B b;
C c;
};
int main() {
alias a;
a.a.one = 1; // OK
a.b.two = 2; // OK
a.c.three = 3; // OK
}
Весь этот анонимный член объединения все еще немного озадачивает меня, так как я не могу найти в стандарте ничего, что могло бы сделать эту работу.