POD成员默认初始化没有大括号

vla*_*don 6 c++ list-initialization c++14

给定代码:

struct Test {
    int a = 1;
    int b = 2;
};

Test test1;
Test test2{};
Run Code Online (Sandbox Code Playgroud)

对于test2我敢肯定,这test2.a == 1test2.b == 2.难道保证(或没有)相同的test1(不{})?

YeP*_*IcK 7

这条线

Test test1;
Run Code Online (Sandbox Code Playgroud)

等效于与在不存在与显式初始化列表手写一个的并且没有一个默认的构造的初始化Test() = deleted;最终将两个构件到其指定的初始值设定12.

"默认构造函数"是可以不带参数调用的构造函数,这与上述语句完全相同.

您可以阅读标准中默认构造函数的规则- 转到§12.1第4节:

类X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用...

在第5节中进一步说明:

默认构造函数(默认构造函数,默认情况下未定义为已删除)是在odrused(3.2)创建其类类型的对象(1.8)时隐式定义的...


son*_*yao 6

是的,它们在这里具有相同的效果.

对于第一种情况,它是默认初始化,

如果T是类类型,则考虑构造函数并对空参数列表进行重载解析.选择的构造函数(它是默认构造函数之一)被调用以提供新对象的初始值;

这意味着将调用隐式定义的默认构造函数; 它不使用任何成员初始化列表,然后默认成员初始化程序将生效初始化数据成员.

对于第二种情况,它是聚合初始化,

如果初始化程序子句的数量小于成员数and bases (since C++17)或初始化程序列表完全为空,and bases (since C++17)则初始化其余成员by their default initializers, if provided in the class definition, and otherwise (since C++14)...

因此,默认成员初始化程序也将生效,以初始化数据成员.


R S*_*ahu 4

test1还保证将其成员a初始化为1并将其成员b初始化为2

来自C++11 FAQ,类内成员初始值设定项

C++11 的基本思想是允许非静态数据成员在声明的地方(在其类中)进行初始化。当需要运行时初始化时,构造函数可以使用初始化程序。考虑:

class A {
  public:
    int a = 7;
};
Run Code Online (Sandbox Code Playgroud)

这相当于:

class A {
  public:
    int a;
    A() : a(7) {}
};
Run Code Online (Sandbox Code Playgroud)

  • @YePhIcK,我答案的第一个版本是错误的。我在没有看清楚问题的情况下发布了答案。 (3认同)