为什么我的复制列表初始化在我添加继承后停止工作?

Why does my copy list initialization stop working after I add inheritance?

我已经用这种方式初始化我的一个结构,没有任何问题已经有一段时间了:

struct MyStruct
{
    float firstArr[4];
    float secondArr[4];
    float thirdArr[4];
    float fourthArr[4];
};

void Function()
{
    std::vector<MyStruct> myArr;

    myArr.push_back // This works fine
    ({
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 }
    });
}

当我开始从 Parent 派生我的结构时,我无法再这样做了。

struct Parent
{
    // Nothing
};

struct MyStruct: Parent
{
    float firstArr[4];
    float secondArr[4];
    float thirdArr[4];
    float fourthArr[4];
};

void Function()
{
    std::vector<MyStruct> myArr;

    myArr.push_back // This gets compiler errors
    ({
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 }
    });
}

第二个代码块在尝试以这种方式初始化时出现编译器错误。

是否有一个我可以声明的构造函数允许我像那样初始化并且仍然让我的结构派生自另一个构造函数?我不知道为什么它一开始就给我一个错误,尤其是因为父结构是空的。

我的整个项目都像这样推回它的 "child" 结构,那么有什么办法可以解决这个问题而不包括我更改每个初始化程序吗?

稍后我将需要将 MyStruct 对象推回到 std::vector<Parent> 上,这可能在初始化方面有完全不同的问题,但我什至似乎无法通过这个先有问题

在您的第一个示例中,MyStruct 是一个 aggregate,因此成员只是使用初始化列表中的值进行复制初始化。

在您的第二个示例中,MyStruct 不再是聚合,因为它具有基数 class,因此编译器会寻找构造函数;唯一可用的构造函数是隐式定义的默认构造函数 (MyStruct()),因此会出现错误。

解决此问题的一种方法是将 std::array 与正确定义的构造函数一起使用

struct MyStruct: Parent
{
MyStruct(
  std::array<float, 4> const& first,
  std::array<float, 4> const& second,
  std::array<float, 4> const& third,
  std::array<float, 4> const& fourth)
   : firstArr{first}, secondArr{second}, thirdArr{third}, fourthArr{fourth} {}

  std::array<float, 4> firstArr;
  std::array<float, 4> secondArr;
  std::array<float, 4> thirdArr;
  std::array<float, 4> fourthArr;
};

对于你的第二个问题,正如@FredLarson 指出的那样,你将有一个 bad timeMyStruct 推向 std::vector<Parent>,你需要重新考虑你的设计.