Я пытался узнать больше о союзах и их полезность, когда я был удивлен, что следующий код вполне допустимо и работает точно так же, как и ожидалось:Союзы используются как классы/Структуры
template <class T>
union Foo
{
T a;
float b;
Foo(const T& value)
: a(value)
{
}
Foo(float f)
: b(f)
{
}
void bar()
{
}
~Foo()
{
}
};
int main(int argc, char* argv[])
{
Foo<int> foo1(12.0f);
Foo<int> foo2((int) 12);
foo1.bar();
foo2.bar();
int s = sizeof(foo1); // s = 4, correct
return 0;
}
До сих пор у меня не было не знаю, что законно объявлять союзы с шаблонами, конструкторами, деструкторами и даже функциями-членами. В случае, если это имеет значение, я использую Visual Studio 2012.
Когда я искал в Интернете, чтобы найти больше об использовании союзов таким образом, я ничего не нашел. Это новая функция C++ или что-то особенное для MSVC? Если нет, я хотел бы узнать больше об объединениях, в частности, примеры из них использовались как классы (см. Выше). Если кто-то может указать мне на более подробное объяснение профсоюзов и их использование в качестве структур данных, это было бы высоко оценено.
2003 Стандарт, 9,5 Союзы, параграф 1 «... Союз может иметь функции-члены (включая конструкторы и деструкторы), но не виртуальные функции (10.3) ...» «Так что не новый. Просто необычно. Что касается шаблонов, я не могу найти какую-либо специальную формулировку, но я уверен, что в этом отношении она рассматривается как «класс» (точно так же нет специальной формулировки для 'struct'). – BoBTFish