问题标签 [value-initialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
250 浏览

c++ - 3种类型的初始化

可能重复:
以下短语在 C++ 中是什么意思:零、默认和值初始化?

今天我开始了解 C++ 中的 3 种初始化类型:

  • 零初始化
  • 默认初始化
  • 值初始化

我用谷歌搜索了它,但没有找到令人满意的结果。我得到的只是一些标准。到目前为止我所理解的是:在值初始化的情况下,数据成员在某些情况下可以获得等于零的值。

请举例说明它们(标准)。另外请不要只提供标准中的文本。

谢谢

0 投票
1 回答
297 浏览

c++ - 自动变量的值初始化

可能重复:
不可复制的对象和值初始化:g++ vs msvc
值初始化自动对象?

考虑以下语句:

对自动对象进行值初始化是不可能的。

这个说法是真的吗?我认为这样做没有问题:

0 投票
2 回答
402 浏览

c++ - C++中显式构造函数调用的值初始化?

可能重复:
以下短语在 C++ 中是什么意思:零、默认和值初始化?

有很多地方人们说过,对类构造函数的显式调用会导致值初始化[当不存在使用定义的构造函数时],这不是由默认构造函数[这是一个无操作的构造函数]完成的,而是完全不同的东西。

如果没有调用构造函数,实际会发生什么或在这种情况下什么是值初始化?

0 投票
1 回答
2682 浏览

c++ - 用户定义的构造函数和隐式默认构造函数

我一直在阅读此页面以了解值初始化的概念 http://en.cppreference.com/w/cpp/language/value_initialization

值初始化的效果是:

  • 如果 T 是具有至少一个任何类型的用户提供的构造函数的类类型,则调用默认构造函数。

但这似乎与其他来源直接矛盾,解释说如果至少有一个用户定义的构造函数,那么编译器不会生成隐式默认构造函数(像“T t;”这样的表达式不会编译)。欢迎任何解释。

0 投票
3 回答
1439 浏览

c++ - 对空的用户定义的构造函数将如何初始化非静态非 POD 成员变量感到困惑

我知道非 POD 类型的默认初始化也会通过调用它们的默认构造函数来默认初始化非静态非 POD 成员变量。但我不确定这是如何发生的。这是我的意思的一个例子:

输出是:

基于初始化器的 C++ 标准 (8.5),对于默认初始化:

因此,鉴于此,我确实希望默认构造函数Test()会被调用,但是我的空类默认构造函数尚未明确Test初始化,以某种方式被隐式调用。我想知道这是怎么发生的?Test2 iTest2()

同样,对于值初始化(与上面的示例无关),如果一个空的用户定义的默认构造函数没有显式地将 POD 非静态成员变量初始化为零,那么该变量如何初始化为零(我知道它确实这样做)?由于基于标准,似乎对于值初始化,当您拥有用户定义的默认构造函数时发生的所有事情就是构造函数被调用。

值初始化的 C++ 标准的相应部分如下:

这个问题类似于c++ 空构造函数和成员初始化 ,但不同的是,我不是问最终结果行为是什么,而是想知道为什么会发生最终结果行为。

0 投票
4 回答
364 浏览

c++ - 输入迭代器的值初始化

我正在阅读“Accelerated C++”一书的第 8 章。第 8.3 节是关于输入和输出迭代器的:

[...]

复制的第二个参数创建一个默认(空)istream_iterator,它不绑定到任何文件。istream_iterator 类型有一个默认值,其属性是任何已到达文件结尾或处于错误状态的 istream_iterator 似乎都等于默认值。因此,我们可以使用默认值来指示复制的“one-past-the-end”约定。

这就是我的理解:istream_iterator 是一个模板类,而 istream_iterator<int> 是模板的一个实例。编写 istream_iterator< int>() 会触发 istream_iterator< int> 对象的值初始化,这意味着零初始化 + 调用隐式默认构造函数 ( http://en.cppreference.com/w/cpp/language/value_initialization )。我认为 istream_iterator< int> 对象的默认初始化也可以正常工作(触发对默认构造函数的调用),所以我尝试了这个:

但这不会编译:

错误:“,”标记之前的预期主表达式

我不明白发生了什么事。欢迎任何解释。

0 投票
1 回答
86 浏览

inheritance - 派生类的大括号(无构造函数)初始化

使用大括号进行初始化的方法是什么derived,这意味着无需显式编写构造函数?

0 投票
1 回答
188 浏览

c++ - 具有独占继承构造函数的类的值初始化

根据cppreference,没有任何用户提供的构造函数的非联合类类型将在构造之前进行零初始化:

如果 T 是没有任何用户提供的构造函数的非联合类类型,则对象被零初始化,然后调用隐式声明的默认构造函数(除非它是微不足道的)

我不确定使用 c++11 继承的构造函数时会发生什么,因为引用明确提到了隐式声明的默认构造函数。

给定以下示例:

什么是正确的输出,0 还是 5?是否应该在值初始化 ( B{ }) 之前将专门提供继承构造函数的类类型初始化为零?

0 投票
1 回答
176 浏览

c++ - How to invoke clang++ or g++ to exactly replicate the requirements in two different standard versions

I'm trying to nail down the differences between N3337 §8.5p7 (C++11) and N3797 §8.5p8 (post C++11) that deal with value-initialization.

N3337 §8.5p7:

To value-initialize an object of type T means:

  • if T is a (possibly cv-qualified) class type (Clause 9) with a user-provided constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
  • if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is called.
  • if T is an array type, then each element is value-initialized;
  • otherwise, the object is zero-initialized.

An object that is value-initialized is deemed to be constructed and thus subject to provisions of this International Standard applying to “constructed” objects, objects “for which the constructor has completed,” etc., even if no constructor is invoked for the object’s initialization.

N3797 §8.5p8:

To value-initialize an object of type T means:

  • if T is a (possibly cv-qualified) class type (Clause 9) with either no default constructor (12.1) or a default constructor that is user-provided or deleted, then the object is default-initialized;
  • if T is a (possibly cv-qualified) class type without a user-provided or deleted default constructor, then the object is zero-initialized and the semantic constraints for default-initialization are checked, and if T has a non-trivial default constructor, the object is default-initialized;
  • if T is an array type, then each element is value-initialized;
  • otherwise, the object is zero-initialized.

An object that is value-initialized is deemed to be constructed and thus subject to provisions of this International Standard applying to “constructed” objects, objects “for which the constructor has completed,” etc., even if no constructor is invoked for the object’s initialization.

Given these two rules the snippet below should give different results:

as follows:

  1. According to N3337, the default constructor for Derived is called, as Derived has a user-provided constructor. The default constructor for Derived calls Base default constructor, which initializes Derived::i = 10, leaving Derived::j unitialized.
  2. From N3797, as Derived has no user-provided default constructor, nor a deleted default constructor, the second bullet point applies. That is, Derived is zero-initialized, i.e., both Derived::i and Derived::j are initialized with 0 and the object d is default-initialized, which leaves Derived::i = 10.

Although my knowledge of Unixes is minimum, I've been trying to replicate these two cases, using different flags for the compilers clang++ and g++, by trial and error, in Coliru, to no avail. The results so far, all printed d.i = 10 d.j = 0 without warnings.

0 投票
0 回答
84 浏览

c++ - 如何始终正确初始化?

使用 C++11 引入了统一初始化,我的印象{}是现在对于所有情况(如果允许)都是非常安全的初始化。但我刚刚注意到,我弄错了。

什么所有类型的安全初始化形式?带有已删除/私人默认 c'tor 或课程的霸菱课程。

某些类型的详细信息

这是一个内置的

但是像这样的聚合tm

但使用C 数组

使用编译器生成的 default-c'tor 聚合之外的又如何呢?

我忘记了一个重要的种类吗?

适合所有人的模板?

作为一个扩展的问题,我想知道是否有一种适当的/好的/任何方式来编写一个模板函数,该函数为可以以这种方式初始化的所有类型返回一个正确初始化的对象: