Почему унаследованные члены структуры недоступны в объединении? - PullRequest
1 голос
/ 09 января 2020

У меня есть следующий код, который генерирует ошибку во время компиляции:

struct s { int three; };

union alias {
    struct { int one; };
    struct { int two; };
    struct : s {};
};

int main()
{
    alias a;
    a.one = 1;   // OK
    a.two = 2;   // OK
    a.three = 3; // error: 'union alias' has no member named 'three'
    return 0;
}

По некоторым причинам члены наследуемой структуры в объединении недоступны. Основная цель этого кода - предоставить псевдонимы членам struct s.

Почему компилятор не видит членов унаследованной структуры? Какие-нибудь варианты сделать их доступными?

1 Ответ

3 голосов
/ 09 января 2020

Хорошо, после небольшого почесывания головы, я думаю, что могу объяснить это правильно. Ну, для начала, это 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
}

Весь этот анонимный член объединения все еще немного озадачивает меня, так как я не могу найти в стандарте ничего, что могло бы сделать эту работу.

...