Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 让所有成员在C+中活动是否安全+;工会?_C++ - Fatal编程技术网

C++ 让所有成员在C+中活动是否安全+;工会?

C++ 让所有成员在C+中活动是否安全+;工会?,c++,C++,根据,union的活动成员并不意味着语言/编译器的任何操作。我们必须自己确保正确激活/停用成员,即通过调用其构造函数/析构函数 考虑到这一点,让所有成员都处于活动状态应该是安全的(它目前的工作方式是这样的,根本不进行任何分配),但我想知道我是否在某个时候使用了未定义的行为(因为我肯定不使用必须执行的placement new的返回值(或std::launder)为了通过优化器避免问题) ///不是真正的工会 ///这是访问名为 ///并且仍然能够对它们进行迭代, ///因此\see bucket

根据,union的活动成员并不意味着语言/编译器的任何操作。我们必须自己确保正确激活/停用成员,即通过调用其构造函数/析构函数

考虑到这一点,让所有成员都处于活动状态应该是安全的(它目前的工作方式是这样的,根本不进行任何分配),但我想知道我是否在某个时候使用了未定义的行为(因为我肯定不使用必须执行的placement new的返回值(或
std::launder
)为了通过优化器避免问题)

///不是真正的工会
///这是访问名为
///并且仍然能够对它们进行迭代,
///因此\see bucket和\see bucket始终都处于活动状态
联合水桶
{
使用Type=std::map;
结构
{
a型;
b型;
c型;
d型;
e型;
f型;
}水桶;
类型铲斗[6];
静态断言(sizeof(bucket)==sizeof(bucket));
bucket(){for(auto¤t:bucket)new(¤t)Type();}
~bucket(){for(auto¤t:bucket)current.~Type();}
};
您不能让所有工会成员都处于“活动”状态

只有最后写入的成员才处于活动状态


任何试图读取其他成员的行为都会导致未定义的行为。

当然,让
联合的所有成员都处于活动状态是可以保存的


请记住,只有最后写入的一个是,因此上述内容并不那么有趣,因为它只适用于具有零个或一个成员的
联合。

联合的所有成员(同时)都处于活动状态是不可能的。任何时候都只有一个成员处于活动状态。如果在未正确停用前一个成员的情况下激活了另一个成员(如果需要,请调用析构函数),则该前一个活动成员将被错误停用,而不是保持活动状态

如果希望所有成员都处于活动状态,则需要一个非联合类。

告诉我们这样做是可以的,至少从C++14开始是这样

在具有非联合类类型T1的活动成员的标准布局联合中,允许读取非联合类类型T2的另一个联合成员的非静态数据成员m,前提是m是T1和T2的公共初始序列的一部分(除非通过非易失性glvalue读取易失性成员未定义)


因为在当前情况下,T1和T2仍然提供相同的类型。

活动成员只是最后一组。您只有
bucket
成员处于活动状态…您的代码仅激活
bucket
。另一个成员仍处于非活动状态。您无法通过观察程序的行为来确定它没有未定义的行为。如果要通过索引访问结构成员,请重载索引运算符。对于迭代,添加
begin()
end()
成员函数。当然可以,代码确实可以工作(可能通过使用未定义的行为)@rob如果您有,那么代码就不“工作”,看起来就是这样。它可以在你最意想不到的时候停止“工作”。它可能会导致硬盘格式化,或程序崩溃,甚至会调用。这是相当挑剔的,因为它只是解释了术语“全部”包含零或一个元素(这肯定比我的问题更精确,我的问题应该首先使用多个或多个元素)
/// not really a union 
/// just a handy way to access the individual elements named 
/// and still be able to iterate over them, 
/// thus \see bucket and \see buckets are always both active
union Buckets
{
    using Type = std::map<int,char>;

    struct
    {
        Type    a;
        Type    b;
        Type    c;
        Type    d;
        Type    e;
        Type    f;
    }       bucket;
    Type    buckets[6];

    static_assert(sizeof(bucket) == sizeof(buckets));
    Buckets()  { for (auto& current : buckets) new(&current) Type(); }
    ~Buckets() { for (auto& current : buckets) current.~Type(); }
};