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

是否可以将多个对象放在一个联合体中?

  •  11
  • GetFree  · 技术社区  · 17 年前

    union{
        vector<int> intVec ;
        vector<float> floatVec ;
        vector<double> doubleVec ;
    } ;
    

    当然,我将只使用3个向量中的一个。但是当所有3个向量都被构造时会发生什么??
    3个向量的构造函数会相互干扰吗??(因为其中3个在同一个内存地址中)

    5 回复  |  直到 14 年前
        1
  •  16
  •   Alex B    17 年前

    当前C++标准不允许在工会内部使用非POD类型。您将从中获得此编译器错误 gcc :

    error: member ‘std::vector<int, std::allocator<int> >
    <anonymous union>::i’ with constructor not allowed in union
    error: member ‘std::vector<int, std::allocator<int> >
    <anonymous union>::i’ with destructor not allowed in union
    

    新C++标准 C++0x )提议 unrestricted unions ,但是 adds yet more object lifetime pitfalls to C++ .

        2
  •  9
  •   avakar    17 年前

    不能有包含非POD类类型的联合。您的示例将无法编译。

    boost::variant 作为C型接头的安全替代品。见 documentation on boost.org . 然而,您可能会重新考虑您的设计并改用多态性。当然,这取决于你想要完成什么。

        3
  •  2
  •   anon anon    17 年前

    从C++标准,第9.5节:

    具有 非平凡构造函数(12.1),a 非平凡复制构造函数(12.8),一个 非平凡析构函数(12.4),或 非平凡复制赋值运算符 (13.5.3、12.8)不能是 协会

    这里,对于“非平凡”改为“有用”:-)

        4
  •  2
  •   Jonas Kölker    17 年前

    C++标准不允许程序,所以它(最好)实现定义了什么。

    如果所有析构函数都被调用,并且它们都释放了“它们的”内存,那么您将执行双重释放(三重,acually);这可能会损坏分配数据结构,这是一件坏事。如果崩溃了,要高兴,因为如果不崩溃,调试会困难得多。

    我想这些问题可能是 标准不允许这样。

        5
  •  2
  •   karel Aadil Minhaz    7 年前

    现在C++标准支持变体。检查 https://en.cppreference.com/w/cpp/utility/variant .

    std::variant

    在标题中定义

    template <class... Types>   
    class variant;
    

    (从C++17开始)

    类模板 std::variant 表示类型安全的 union . 实例 在任何给定的时间,要么保存其可选类型之一的值,要么在出现错误的情况下-无值(这种状态很难实现,请参阅 valueless_by_exception

    与联合一样,如果变量持有某个对象类型T的值,则T的对象表示将直接分配到变量本身的对象表示中。不允许变量分配额外(动态)内存。

    变量不允许包含引用、数组或类型void。空变体也是格式不正确的( std::variant<std::monostate>

    允许变体多次保存同一类型,并保存同一类型的不同cv限定版本。

    与工会在选举期间的行为一致 aggregate initialization ,默认构造的变量保留其第一个备选方案的值,除非该备选方案不可默认构造(在这种情况下,该变量也不可默认构造)。助手类 std::monostate

        6
  •  1
  •   Simon Broadhead    17 年前

    你可能想看看 Boost.Variant 它可以包含不同类型的单个值。

    推荐文章