Я пытался узнать больше об объединениях и их полезности, когда был удивлен, что следующий код совершенно корректен и работает точно так, как ожидалось:
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? Если нет, я хотел бы узнать больше об объединениях, в частности, о примерах их использования в качестве классов (выше). Если бы кто-нибудь мог указать мне на более подробное объяснение союзов и их использования в качестве структур данных, я был бы очень признателен.
"... A union can have member functions (including constructors and destructors), but not virtual (10.3) functions. ..."
Так что не ново. Просто необычно. Что касается шаблонов, я не могу найти какой-либо специальной формулировки, но я почти уверен, что в этом отношении он рассматривается какclass
(точно так же нет специальной формулировки дляstruct
s). - person BoBTFish   schedule 08.08.2013