C ++中的结构未初始化问题

泛光灯

我有以下三个结构定义,对于SA, SBad, SC,我简化了名称和成员以说明问题。

 struct SA {
     int snap;
 };

 template <int W> class VString
 {
     char data[W];
   public:
     VString() { }
 };

 struct SBad {
     VString<9> s;
     int i;
 };

 struct SC {
     int inst;
 };

我有一个包含结构来保存来自网络的数据,该结构由上述结构组成:

 struct S {
     std::vector<SA>           m_a;
     SBad                      m_bad;
     std::vector<SC>           m_c;
 };

在代码中,我需要经常使用以下方法重置结构:

// data member
S m_s;
// member function
void clear() {
   m_s.m_bad   = {};
}

我正在使用gcc版本7.3.1。使用调试版本,可以很好地工作,而使用发布版本,则失败,并且:

error: '<anonymous>' is used uninitialized in this function [-Werror=uninitialized]

gcc标志是:

-std=c++11 -O3 -Werror -Wall

为什么会出现此错误,这是将数据初始化为零的明确方法,对吗?如果我更改为:

void clear() {
    SA sa{};
    m_s.a = sa;
    m_s.b = {};
    ...
}

相反,发行版本将成功。

更新:

我创建了一个最低工作测试用例来说明问题。

沿

您只能将花括号初始化与“聚合”一起使用。引用标准:

集合是没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11章),没有基类(第10章)以及没有虚函数(10.3)的数组或类(第9节))。

...

初始化聚合时,初始化程序可以包含一个初始化程序子句,该子句由大括号括起来的,逗号分隔的初始值子句列表组成,该子句用于聚合成员,以递增的下标或成员顺序编写。如果聚合包含子聚合,则此规则将递归应用于子聚合的成员。

对你来说,SBad不是一个聚合,因为SBad::s类型VString不是因为你定义的构造函数的集合VString为了使您的代码正常工作,请删除的构造函数VString

 template <int W> class VString {
     char data[W];
 };

在这里尝试:https : //godbolt.org/z/TTonr6

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章