草庐IT

UNION-ed

全部标签

具有重要成员的 C++11 匿名 union

我正在更新我的一个结构,我想向它添加一个std::string成员。原始结构如下所示:structValue{uint64_tlastUpdated;union{uint64_tui;int64_ti;floatf;boolb;};};仅仅向union中添加一个std::string成员当然会导致编译错误,因为通常需要添加对象的非平凡构造函数。Inthecaseofstd::string(textfrominformit.com)Sincestd::stringdefinesallofthesixspecialmemberfunctions,Uwillhaveanimplicitlyd

c++ - C: union 实际用在什么地方?

我有一个例子,其中保证了类型的对齐,unionmax_align。我正在寻找一个实际使用union的更简单的例子来解释我的friend。 最佳答案 我通常在解析文本时使用union。我使用这样的东西:typedefenumDataType{INTEGER,FLOAT_POINT,STRING}DataType;typedefunionDataValue{intv_int;floatv_float;char*v_string;}DataValue;typedefstructDataNode{DataTypetype;DataValue

c++ - 常量 union 对象有什么用?

如果我创建了一个constunion对象(例如在下面的代码中),则不能在其中进行任何成员分配。那么在任何情况下都可以使用constunion对象吗?unionun{inti;floatf;charc;};constunionuna;///!a.i=10;error. 最佳答案 您仍然可以按如下方式初始化union:constunionuna={.i=100};然后在你的代码中使用它。 关于c++-常量union对象有什么用?,我们在StackOverflow上找到一个类似的问题:

c++ - union 作为基类

该标准定义了union不能用作基类,但是对此有什么具体的理由吗?据我所知,union可以有构造函数、析构函数、成员变量和操作这些变量的方法。简而言之,union可以封装可以通过成员函数访问的数据类型和状态。因此,在最常见的术语中,它有资格成为一个类,如果它可以充当一个类,那么为什么它不能充当基类呢?编辑:虽然答案试图解释推理,但我仍然不明白Union作为派生类比作为一个类的Union更糟糕。因此,为了获得更具体的答案和推理,我将插入这个悬赏。对已经发布的答案没有冒犯,谢谢! 最佳答案 托尼·帕克给出了一个非常接近事实的答案。C++委

c++ - C/C++ 中 union 的大小

C/C++中union的大小是多少?它是里面最大数据类型的大小吗?如果是这样,如果union的较小数据类型之一处于事件状态,编译器如何计算如何移动堆栈指针? 最佳答案 union总是占用与最大成员一样多的空间。当前使用什么并不重要。union{shortx;inty;longlongz;}上述union的一个实例总是需要至少一个longlong来存储。旁注:如Stefano所述,任何类型(union、struct、class)所占用的实际空间确实取决于其他问题,例如编译器的对齐。为简单起见,我没有进行此操作,因为我只是想告诉unio

c++ - 在哪里使用 std::variant 而不是 union ?

请解释一下union和std::variant有什么区别,为什么std::variant被引入标准?在什么情况下我们应该使用std::variant而不是老式的union? 最佳答案 一般来说,您应该更喜欢variant除非出现以下情况之一:你在作弊。您正在做类型双关语或其他UB的事情,但您希望您的编译器不会破坏您的代码。你正在做一些C++union的伪双关语。s被允许做:布局兼容类型之间或公共(public)初始序列之间的转换。您明确需要布局兼容性。variant不需要有任何特定的布局;unions的标准布局类型是标准布局。您需要

基于其他元素大小的 C++ union 元素大小

考虑以下代码:structS{union{intarr1[10];chararr2[sizeof(arr1)];};};在c++03和c++11模式下使用gcc4.9.2编译成功。但是,当我更改S成为这样的模板:templatestructS{union{intarr1[N];chararr2[sizeof(arr1)];};};我得到以下错误输出:error:intS::::arr1[10]’isinaccessibleintarr1[N];error:withinthiscontextchararr2[sizeof(arr1)];Clang仅在c++11模式下编译这两个版本。我很好

c++ - 为什么编译器不允许 std::string 在 union 内?

我想在Union中使用字符串。如果我写如下unionU{inti;floatf;strings;};编译器给出错误说U::S有复制构造函数。我阅读了其他一些帖子以了解解决此问题的替代方法。但我想知道为什么编译器一开始就不允许这样做?编辑:@KennyTM:在任何union中,如果成员被初始化,其他成员将具有垃圾值,如果没有初始化,则所有成员都将具有垃圾值。我认为,标记union只是为从union访问有效值提供了一些安慰。您的问题:您或编译器如何在没有额外信息的情况下为上述union编写复制构造函数?sizeof(string)给出4个字节。基于此,编译器可以比较其他成员的大小并分配最大

c++ - 如果我在 C 或 C++ 中执行 `typedef`,我什么时候应该在 typedef'ed 类型的末尾添加 `_t`?

这个问题在这里已经有了答案:C++typesuffix_t,_typeornone(4个回答)关闭4年前。我很困惑何时应该将尾随_t添加到typedef的类型?例如,我应该这样做:typedefstructimageimage_t;或者这个:typedefstructimageimage;一般规则是什么?另一个例子,我应该这样做:typdefenum{ARRAY_CLOSED,ARRAY_OPEN,ARRAY_HALFOPEN}array_type_t;或者这个:typdefenum{ARRAY_CLOSED,ARRAY_OPEN,ARRAY_HALFOPEN}array_type;请

c++ - 使用非平凡的构造函数初始化 union

我有一个结构,我创建了一个自定义构造函数来将成员初始化为0。我在较旧的编译器中看到,在Release模式下,如果不将memset设置为0,则不会初始化这些值。我现在想在union中使用这个结构,但是因为它有一个非平凡的构造函数而出错。那么,问题1。默认编译器实现的构造函数是否保证结构的所有成员都将被初始化为空?非平凡的构造函数只是将所有成员的memset设置为'0'以确保结构清晰。问题2:如果必须在基础结构上指定构造函数,如何实现union以包含该元素并确保初始化为0的基础元素? 最佳答案 问题1:默认构造函数确实根据C++标准将P