我有以下三个结构定义,对于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] 删除。
我来说两句