带有枚举类的初始化结构成员的编译错误

问题描述

以下给出编译错误的程序

// Example program
#include <iostream>
#include <string>

enum class Animation: int{
  Hide=0,Show,Flicker
};

struct Icon {
  int id;
  char name[10];
  Animation currentAnim; 
  Animation nextAnim;
  int isActive; 
};

static struct Icon IconList[]= {
    {1,"Offline",Animation::Hide,1},{2,"Training",{0,1}
};

int main()
{
  std::cout << "Doesn't matter";
}

编译

23:1:错误:初始化时无法将“动画”转换为“字符” 23:1:错误:初始化时无法将“动画”转换为“字符”

如果我将 IconsList [] 的最后一个成员更改为此,则会修复编译错误

{0,"",1}

您能解释一下原因吗?为什么我收到这种情况的编译错误消息?

如果我使用int而不是enum类,那么我不会遇到此编译错误

解决方法

aggregate initialization中,嵌套初始化器列表周围的花括号可以省略,

嵌套的初始值设定项列表周围的花括号可以省去(省略),在这种情况下,将使用尽可能多的初始值设定子句来初始化相应子聚合的每个成员或元素,而后续的初始值设定子句则用于初始化以下内容对象的成员。

成员name是包含10个元素的子集合,初始化程序中的第二个0仅用于初始化name的第一个元素,然后尝试Animation::Hide用于初始化第二和第三元素;但Animation无法隐式转换为char(作为scoped enumeration)。

如果我使用int而不是enum类,则不会遇到此编译错误

这是因为int可以隐式转换为char。请注意,在这种情况下,Icon的某些成员可能未初始化。

如果您打算使用0来初始化成员name,则可以为嵌套的初始化程序添加括号;作为效果,name的第一个元素被初始化为0,其余所有元素也被值初始化(零初始化)到0,与使用{初始化它的方法一样{1}}。

""