【问题标题】:Ambiguity between default-initialization and value-initialization默认初始化和值初始化之间的歧义
【发布时间】:2019-06-27 00:31:56
【问题描述】:

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

这是一个例子:

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?

请帮助我理解这两种初始化形式的主要区别。

【问题讨论】:

  • Looks like Copy Initialization 这是another link,它(大致)涵盖了您可能遇到的所有不同类型的初始化
  • A a; 没有默认初始化。我以为A a1{};默认初始化,A a2{1};值初始化,A a3{a2};复制初始化,虽然上面的链接指出A a1{};是值初始化,所以也许我错了。
  • @Tas 是的,你错了。 A a1{};是值初始化,A a2{1};A a3{a2};是直接初始化。

标签: c++ initialization value-initialization default-initialization


【解决方案1】:

A a;default initialization,效果是A的默认构造函数用于初始化。由于Aimplicitly-generated default constructor 什么都不做,所以a.x 的值是不确定的。

A()value initialization

如果 T 是具有既不是用户提供也不是删除的默认构造函数的类类型(即,它可能是具有隐式定义或默认构造函数的类),则对象为zero-initialized,然后它是default-initialized,如果它有一个非平凡的默认构造函数;

注意与default initialization的区别,A有一个隐式定义的默认构造函数,对象为zero-initialized;所以临时对象A()的数据成员x会被初始化为0

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

int value = 4; 也是copy initializationvalue 将被初始化为 4

【讨论】:

  • 你的意思是如果类A有一个用户定义的构造函数那么写A a;不是默认初始化?
  • @RamiYen 不,A a; 仍然是默认初始化。而A() 仍然是值初始化。但是值初始化的效果会变成和默认初始化一样。两者的效果都会被用户定义的默认构造函数初始化对象,零初始化不再参与。
猜你喜欢
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多