Член Союза имеет пользовательский конструктор

Для следующего кода:

class Foo{
int foo;
public:
Foo() : foo(13) {}
int getFoo() const { return foo; }
};

union Bar{
Foo fBar;
double dBar;
};

Я считаю, что это полностью законно в C ++. http://en.cppreference.com/w/cpp/language/union#Explanation говорит:

Если два члена union являются типами стандартной компоновки, то для проверки их общей подпоследовательности на любом компиляторе четко определено

И поэтому в GCC я могу сделать это:

Bar bar = { Foo() }

Когда я пытаюсь это сделать в Visual Studio 2008, я получаю сообщение об ошибке:

ошибка C2620: участник Bar::fBar из union Bar имеет пользовательский конструктор или нетривиальный конструктор по умолчанию

Ошибка C2620 состояния:

Член объединения не может иметь конструктор по умолчанию.

Что тут происходит? Было ли это когда-либо требованием C ++, я думал, что Стандартное расположение было единственным требованием? Есть ли обходной путь для этого?

1

Решение

В C ++ 98/03 стандарт C ++, указанный в 9.5

[…] Если POD-объединение содержит несколько POD-структур, которые имеют общую начальную последовательность (9.2), и если объект этого типа POD-объединения содержит одну из POD-структур, ему разрешается проверять общее начальная последовательность любого из членов POD-структуры; […]

И это было изменено в C ++ 11 на

[…] Если объединение стандартной компоновки содержит несколько структур стандартной компоновки, которые имеют общую начальную последовательность (9.2), и если объект этого типа объединения стандартной компоновки содержит одну из структур стандартной компоновки, это разрешается для проверки общей начальной последовательности любого из членов структуры стандартного макета; […]

Поэтому до C ++ 11 вы могли использовать только тип POD внутри объединения, что означает, что MSVS 2008 дает вам правильную ошибку. Чтобы использовать новый тип объединения, вам нужно получить версию MSVS, которая поддерживает это изменение. От эта статья MSDN мы можем увидеть в разделе для Неограниченные союзы что это изменение не было сделано до версии 2015 года.

Вы или должны будете обновить или изменить класс, чтобы быть Тип POD

2

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

Других решений пока нет …

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