【发布时间】:2011-10-28 10:17:26
【问题描述】:
我一直认为创建一个新对象总是会调用一个对象的默认构造函数,而构造函数是显式的还是编译器自动生成的并没有区别。根据this highly regarded answer 的另一个问题,这在 C++98 和 C++03 之间发生了微妙的变化,现在像这样工作:
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
new B; // default-initializes (leaves B::m uninitialized)
new B(); // value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.
谁能告诉我:
- 为什么要更改标准,即这有什么好处,或者现在有什么以前没有的可能;
- “默认初始化”和“值初始化”这两个术语究竟代表什么?
- 标准的相关部分是什么?
【问题讨论】:
-
新 C++11 标准的相关部分是 8.5(“Initializers”)第 5,6,7 条。
-
也许它让人们可以选择是否使用默认 ctor。在旧版本的 C++ 中,当没有参数时,括号通常会被忽略。因此,在新选项上加上括号将影响较少的遗留代码。
-
我不会称之为改变,而是更正。它至少在例如上下文中是有意义的。 std::map 其中由 [] 创建的值是值初始化的,例如std::map
所有 U* 都初始化为 0 -
@PlasmaHH,我想我得到了一个灯泡时刻 - 你是说在 C++03 之前,POD 类型将不会被初始化,即使用
()?我确信在特定的std::map情况下std::pair<A,B>()可以显式调用A和B的构造函数。 -
@Mark Ransom: acceleratedcpp.com/authors/koenig/c++std/revisions.pdf 包含 98 和 03 之间差异的非正式列表。在 8.5 左右的更改中,主要区别在于对于没有用户定义 ctor 的非 pod,子对象以前不是初始化,因为 () 是默认初始化,它调用了默认 ctor,它什么也没做。现在 () 是值初始化,当没有用户定义的 ctor 时,它将对所有子对象进行值初始化。由于pair不是POD,默认initd时总是调用A()和B(),所以这里的关键是当B()是非POD且没有用户de
标签: c++ standards default-value default-constructor