我有以下代码
#include <iostream>
using namespace std;
struct S{
int a = 0;
S() = default;
};
union U {
S s;
int i;
};
int main() {
U u;
u.s.a = 1;
return 0;
}但是,它无法编译并发出以下错误
prog.cpp: In function ‘int main()’:
prog.cpp:15:4: error: use of deleted function ‘U::U()’
U u;
^
prog.cpp:9:7: note: ‘U::U()’ is implicitly deleted because the default definition would be ill-formed:
union U {
^
prog.cpp:10:4: error: union member ‘U::s’ with non-trivial ‘constexpr S::S()’
S s;
^但是,当我通过添加默认构造函数来修改U的定义时,它就是编撰。
union U {
S s;
int i;
U() {
}
};我的问题是,为什么没有给定的默认构造函数,代码就不能编译?我们在C++标准中有什么东西可以解释这一点吗?
我的猜测是,如果联合具有非平凡的成员,C++将禁止隐式默认构造函数。具有类内初始化成员的类是非平凡的。我说的对吗?
发布于 2022-04-18 06:32:25
Union不能包含“非平凡”成员:请参见这里。“琐碎”意味着成员不应该对其构造函数做任何操作。将a设置为0是在做一些事情,因此工会不能包含此成员。
发布于 2022-04-18 06:19:14
你的工会有两个会员。在任何时候,这两个成员中的一个是活动的,构造函数必须使其中一个处于活动状态,但是默认构造函数不能知道哪个成员是活动的。
https://stackoverflow.com/questions/71908083
复制相似问题