Ошибка времени компиляции: конструктор объединения по умолчанию удален - PullRequest
0 голосов
/ 03 февраля 2019

Следующий код C ++ не может быть скомпилирован.Поскольку я рассмотрел эту проблему, я понимаю, что проблема заключается в том, что компилятор удалил конструктор объединения по умолчанию.В интерактивной заметке говорится следующее:

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

struct A {
   int val;
   A() : val(0) {}
};

union B
{
   A a;
};

B b;

Почему конструктор по умолчанию для структуры A считается нетривиальным?Как мне обойти эту проблему, чтобы этот код успешно компилировался?

1 Ответ

0 голосов
/ 03 февраля 2019

Почему конструктор по умолчанию для структуры A считается нетривиальным?

Поскольку он объявлен пользователем.

Примеры классов, имеющих тривиальный конструктор:

struct Trivial {
    int val;
};

struct Trivial2 {
    int val;
    Trivial2() = default;
};

В качестве бонуса, это нетривиально:

struct NonTrivial {
    int val;
    NonTrivial();
};
NonTrivial::NonTrivial = default;

Если вы хотите, чтобы A::val было инициализировано нулями, вы захотитедобавить инициализатор члена по умолчанию в объединение:

union B {
   A a = {};
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...