4

当我惊讶于以下代码完全有效并且完全按预期工作时,我试图了解有关联合及其有用性的更多信息:

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 特有的特性?如果没有,我想了解更多关于联合的信息,特别是它们的示例,例如类(上图)。如果有人能指出我对联合及其作为数据结构的使用的更详细解释,将不胜感激。

4

1 回答 1

2

这是 C++ 的新特性,还是 MSVC 特有的特性?

不,正如 BoBtFish 所说,2003 C++ 标准部分9.5 Unions段落1说:

[...]联合可以具有成员函数(包括构造函数和析构函数),但不能具有虚拟(10.3)函数。联合不应有基类。联合不应用作基类。具有非平凡构造函数 (12.1)、非平凡复制构造函数 (12.8)、非平凡析构函数 (12.4) 或非平凡复制赋值运算符 (13.5.3, 12.8) 的类的对象不能是联合的成员,也不能是此类对象的数组。如果联合包含静态数据成员或引用类型的成员,则程序格式错误。

unions 确实在 section 下9 Classes,class-key 的语法如下:

class-key:
   class
   struct
   union

所以行为就像 aclass但有更多的限制。关键限制是unions一次只能有一个活动的非静态成员,这也包含在段落中1

在一个联合中,任何时候最多可以有一个非静态数据成员处于活动状态,即任何时候最多可以有一个非静态数据成员的值存储在一个联合中。[...]

中的措辞C++11 draft standard是相似的,因此从那以后没有太大变化2003

至于 a 的使用union,有两个常见的原因,在之前的C/C++ 线程中从不同的角度进行了介绍: 什么时候有人会使用联合?它基本上是C only天的残余吗?总结一下:

这个答案给出了Unions cannot be used as Base class一些非常深刻的见解,为什么unions要在C++.

于 2013-08-11T03:28:11.700 回答