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

时间:2019-06-27 00:31:56

标签: 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

}

在我看来还是可以的,但是在这里:

int value = 4; // is this considered a value-initialization?

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

1 个答案:

答案 0 :(得分:4)

xdefault initialization,因为效果是使用x的默认构造函数进行初始化。由于A a;的{​​{3}}不执行任何操作,因此A的值不确定。

Aimplicitly-generated default constructor

  

如果T是具有既不由用户提供也未删除的默认构造函数的类类型(也就是说,它可能是具有隐式定义或默认默认构造函数的类),则对象为value initialization并且那么如果它具有非平凡的默认构造函数,则为zero-initialized

请注意与default-initialized的区别,a.x具有隐式定义的默认构造函数,而对象是default initialization;因此临时对象A()的数据成员A将被初始化为x

A()zero-initialized,概念上的0是从临时对象A b = A();初始化的,所以b也将被初始化为A() 。注意,由于copy initialization,由于C ++ 17 b.x被保证直接为copy elision;复制/移动构造被省略。

0也是value-initializedb将被初始化为int value = 4;