6

如果您的所有类/结构数据成员都缺少初始化程序,您可以使用统一的初始化语法来构造对象。

struct foo
{
    int i;
    float f;
};
...
foo bar{ 5, 3.141f };

但是如果一个或多个成员有初始化器,统一初始化语法就失效了。

struct foo
{
    int i;
    float f = 0;
};
...
foo bar{ 5, 3.141f };  // Compiler error.

我推测添加数据成员初始化程序会自动实现一个或多个默认构造函数,并抑制构造函数的默认实现initialization_list。这是预期的标准吗?为什么它会这样工作?

4

1 回答 1

2

是的,这是标准的意图。您在这里尝试的是聚合初始化。不幸的是,foo由于f. 见8.5.1 [dcl.init.aggr](强调我的):

聚合是一个数组或类(第 9 条),没有用户提供的构造函数(12.1),没有用于非静态数据成员的大括号或等式初始化器(9.2),没有私有或受保护的非静态数据成员(第 11 条) ),没有基类(第 10 条),也没有虚函数(10.3)。

因为您对 member 有一个相等的初始化程序,所以f您需要提供一个自定义构造函数来支持您所追求的语法:

struct foo
{
  int i;
  float f = 0;
  constexpr foo(int i, float f) : i(i), f(f) { }
};
...
foo bar{ 5, 3.141f }; // now okay

至于为什么在标准中规定了这一点,我不知道。

于 2013-10-08T21:06:59.393 回答