【问题标题】:Unions used like Classes/Structs像类/结构一样使用的联合
【发布时间】:2013-08-08 14:27:13
【问题描述】:

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

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 段 "... A union can have member functions (including constructors and destructors), but not virtual (10.3) functions. ..." 所以不是新的。只是不常见。在模板方面,我找不到任何特殊的措辞,但我很确定在这方面它被视为class(同样structs没有特殊的措辞)。跨度>

标签: c++ unions


【解决方案1】:

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

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

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

unions 属于9 Classes 部分,class-key 的语法如下:

class-key:
   class
   struct
   union

所以就像class,但有更多的限制。关键限制是unions 一次只能有一个活动的非静态成员,这也在1 段中介绍:

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

C++11 draft standard 中的措辞相似,因此自2003 以来没有太大变化。

至于union的使用,有两个常见的原因,在上一个线程C/C++: When would anyone use a union? Is it basically a remnant from the C only days?中从不同角度进行了总结:

answerUnions cannot be used as Base class 提供了一些非常深刻的见解,说明为什么 unions 会像在 C++ 中那样实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多