首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么具有类内初始化的类不能用作联合的成员?

为什么具有类内初始化的类不能用作联合的成员?
EN

Stack Overflow用户
提问于 2022-04-18 05:59:48
回答 2查看 73关注 0票数 0

我有以下代码

代码语言:javascript
运行
复制
#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;
}

但是,它无法编译并发出以下错误

代码语言:javascript
运行
复制
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的定义时,它就是编撰

代码语言:javascript
运行
复制
union U {
    S s;
    int i;
    U() {
 
    }
};

我的问题是,为什么没有给定的默认构造函数,代码就不能编译?我们在C++标准中有什么东西可以解释这一点吗?

我的猜测是,如果联合具有非平凡的成员,C++将禁止隐式默认构造函数。具有类内初始化成员的类是非平凡的。我说的对吗?

EN

回答 2

Stack Overflow用户

发布于 2022-04-18 06:32:25

Union不能包含“非平凡”成员:请参见这里。“琐碎”意味着成员不应该对其构造函数做任何操作。将a设置为0是在做一些事情,因此工会不能包含此成员。

票数 1
EN

Stack Overflow用户

发布于 2022-04-18 06:19:14

你的工会有两个会员。在任何时候,这两个成员中的一个是活动的,构造函数必须使其中一个处于活动状态,但是默认构造函数不能知道哪个成员是活动的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71908083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档