默认初始化和值初始化之间的歧义

Ram*_*Yen 12 c++ initialization value-initialization default-initialization

我发现许多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并不清楚。

这是一个例子:

class A{
   public:
      int x;
};


int main(){
    A a;// default initialization so x has undefined value.
    A b = A(); // value initialization so x is a scalar thus it is value initialized to 0

}
Run Code Online (Sandbox Code Playgroud)

我猜上面在上面可以,但是在这里:

int value = 4; // is this considered a value-initialization?
Run Code Online (Sandbox Code Playgroud)

请帮助我了解两种初始化形式之间的主要区别。

son*_*yao 4

A a;默认初始化,因为默认构造函数A用于初始化。由于隐式生成的默认构造函数A执行任何操作,a.x因此具有不确定的值。

A()值初始化

如果 T 是一个具有既不是用户提供的也不是删除的默认构造函数的类类型(也就是说,它可能是一个具有隐式定义或默认默认构造函数的类),则该对象为零初始化,然后它是默认的 -如果它有一个重要的默认构造函数,则进行初始化;

注意与默认初始化的区别,A有一个隐式定义的默认构造函数,并且对象是零初始化的x所以临时对象的数据成员A()将被初始化为0

A b = A();复制初始化,概念上b是从临时对象初始化A(),所以b.x也会被初始化0。请注意,由于复制省略,C++17b保证直接进行值初始化;复制/移动结构被省略。

int value = 4;也是复制初始化value将被初始化为4.