C ++ 11 «В инициализации класса» функция не работает для союзов

Пример минимального кода:

struct B {
union U {
struct S {} s;
int i = 100;
}
u;
};

Теперь, если мы объявим B obj; тогда obj.u.i назначается значение мусора вместо 100, Увидеть демо здесь. (Значение мусора отличается в зависимости от флагов оптимизации и т. Д.).

Предполагается, что функция «В инициализации класса» должна работать с объединениями.

  • Если да, то каков правильный синтаксис? Или это ошибка G ++?
  • Если нет то что int i = 100; делает?

9

Решение

Это похоже на ошибку GCC. Стандарт гласит (9.5p2):

Не более одного нестатического члена данных объединения может иметь скобки или равно-инициализатор.

В остальном, правила те же, что и для обычного класса.

РЕДАКТИРОВАТЬ: Кроме того, 12.6.2p8:

В не делегирующем конструкторе, если данный нестатический элемент данных или
Базовый класс не обозначен мем-инициализатор-идентификатор (в том числе
случай, когда нет
мем-инициализатора-лист потому что конструктор не имеет т е р-инициализатор) и сущность не является виртуальным базовым классом абстрактного класса (10.4), то

  • если объект является нестатическим членом данных, который имеет скобки или равно-инициализатор, объект инициализируется, как указано в 8.5;
  • в противном случае, если объект является вариантом члена (9.5), инициализация не выполняется;
  • в противном случае объект инициализируется по умолчанию (8.5).

Предположительно здесь учитывается неявно определенный конструктор по умолчанию. i член соответствует критериям в первом пункте маркера, поэтому он инициализируется так, как если бы он был обычным членом класса. s элемент соответствует второй точке маркера, поэтому он остается неинициализированным.

3

Другие решения

Я думаю, что это так, потому что профсоюз объединяет более одного элемента. Ниже представлен обход синтаксиса:

struct B {
union U {
int i;
}
u {100};
};

int main () {
B obj;
std::cout << "obj.u.i = " << obj.u.i << "\n";
}
2

По вопросам рекламы [email protected]