为什么不对联合成员数据进行默认初始化?

Why aren't union member data default-initialized?

AFAIK a class/struct/union 没有在构造函数初始化列表中初始化其成员数据,然后它们被默认初始化。如果成员数据是内置整数类型,则它具有不确定的值。如果它是 class 类型,则调用其默认构造函数(需要可访问且未删除的默认构造函数)。

这是我的例子:

struct A{
    A(){std::cout << "A()\n";}
    A(int){std::cout << "A(int)\n";}
    A(A const&){std::cout << "A(A const&)\n";}
    ~A(){std::cout << "~A()\n";}
    A& operator = (A const& ){std::cout << "=(Aconst&)\n"; return *this;}
};

struct B{
    B(int){std::cout << "B(int)\n";} // a_ and d_ are default-init
    double d_;
    A a_;
};

B b = 10;

输出:

A()
B(int)
~A()

到这里我还好,但是 union:

的成员呢
union U{
    U(){std::cout << "U()\n";} // needed because a_'s class type has defined a user-defined version
    U(U const&){std::cout << "U(U const&)\n";} // needed as above
    ~U(){std::cout << "~U()\n";} // needed as above
    A a_; // has defined copy-control members
    int i_;
};

U u1;
U u2 = u1;

输出:

U()
U(U const&)
~U()
~U()

union 的成员数据是否在构造函数初始化列表中被默认初始化?谢谢!

So as you can see: the union U didn't initialize its member data a_ and i_

一个联合只有一个成员处于活动状态,因此永远不会出现两个成员可以被初始化的情况。

如果您不在用户定义的构造函数中提供初始化程序,则不会初始化任何联合成员。

联合只是一个位置的多个名称(引用)
无论修改哪个成员,都只会处理一个位置
因此所有其他成员都将被修改

union _Union{
    int i;      //  4 bytes.
    long ll;    //  4 bytes.
    float f;    //  4 bytes.
    char*txt;   //  4 bytes.
};

sizeof(_Union)  =   4 bytes

如果结构大小为 16 字节
联合的大小是最大成员的大小
如果上面 _Union 有另一个 long long int 成员那么它的大小将是 8 个字节
因为 long long int 是 8