Пример минимального кода:
struct B {
union U {
struct S {} s;
int i = 100;
}
u;
};
Теперь, если мы объявим B obj;
тогда obj.u.i
назначается значение мусора вместо 100
, Увидеть демо здесь. (Значение мусора отличается в зависимости от флагов оптимизации и т. Д.).
Предполагается, что функция «В инициализации класса» должна работать с объединениями.
int i = 100;
делает?Это похоже на ошибку GCC. Стандарт гласит (9.5p2):
Не более одного нестатического члена данных объединения может иметь скобки или равно-инициализатор.
В остальном, правила те же, что и для обычного класса.
РЕДАКТИРОВАТЬ: Кроме того, 12.6.2p8:
В не делегирующем конструкторе, если данный нестатический элемент данных или
Базовый класс не обозначен мем-инициализатор-идентификатор (в том числе
случай, когда нет
мем-инициализатора-лист потому что конструктор не имеет т е р-инициализатор) и сущность не является виртуальным базовым классом абстрактного класса (10.4), то
- если объект является нестатическим членом данных, который имеет скобки или равно-инициализатор, объект инициализируется, как указано в 8.5;
- в противном случае, если объект является вариантом члена (9.5), инициализация не выполняется;
- в противном случае объект инициализируется по умолчанию (8.5).
Предположительно здесь учитывается неявно определенный конструктор по умолчанию. i
член соответствует критериям в первом пункте маркера, поэтому он инициализируется так, как если бы он был обычным членом класса. s
элемент соответствует второй точке маркера, поэтому он остается неинициализированным.
Я думаю, что это так, потому что профсоюз объединяет более одного элемента. Ниже представлен обход синтаксиса:
struct B {
union U {
int i;
}
u {100};
};
int main () {
B obj;
std::cout << "obj.u.i = " << obj.u.i << "\n";
}