代码之家  ›  专栏  ›  技术社区  ›  Steve314

在不久的将来,任何主流编译器都有可能支持C++ 0x无限制的联合吗?

  •  7
  • Steve314  · 技术社区  · 15 年前

    对我来说,这似乎很奇怪——基本上,当前的C++对工会总是有一种刺激,而且从来没有合适的限制。您可能会认为,基本上删除一些错误检查是一种相对简单的方法来勾选额外的c++0x支持框,但目前还没有编译器开发人员这么做。

    一个不受限制的并集非常适合这种情况——它提供了一个没有构造函数或析构函数的类型,但是它的大小和对齐方式都允许任何成员。当然,在需要时有显式构造和销毁的方法,当需要typesafe访问时,只需使用适当的联合成员来访问它。支持“适当的”工会也很有用,但即使是一个成员工会,你也会得到巨大的好处,比如。。。

    union Memory_For_Item_t
    {
      Item_t  m_Item;
    };
    

    即使在C++ 0x中有标准的对齐处理特性,当您希望在一个节点中为X项设置空间时,这种方法也会赢得方便和安全,而不是所有的这些项都将在任何时候被使用(或构造)。没有C++ 0x,我们仍然处于黑暗时代WRT对齐问题——每个编译器都以它自己的非标准方式进行。

    无限制工会的唯一问题是我找不到对他们的支持。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Braj    15 年前

    http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport 很好地解决了,即使许多C++的0x特性正在被实现,当前的编译器也没有支持它。

    当前解决联合限制的方法是使用模板编程或强制类型转换创建假联合。

        2
  •  3
  •   Cubbi    15 年前

    GCC现在将其列为 version 4.6 . 它似乎是在7月14日推出的,带有 this patch

        3
  •  1
  •   snk_kid    15 年前

    是的-我现在有一个模板方法, 但它依赖于预处理器 用于标识编译器和 其他的肮脏,主要是为了得到 右对齐处理。看,这是 易碎而且通常很恶心

    你为什么不用 boost::variant ? 如果你不打算使用Boost,你已经使用C++ 0x,那么使用类型特征,比如 std::alignment_of/std::aligned_storage