【发布时间】:2021-12-16 07:09:23
【问题描述】:
给定两个具有不同构造函数的类:
#include <iostream>
struct A {
int x;
A() {};
};
struct B {
int x;
B() = default;
};
int main() {
int x = 5;
x = 7;
printf("before: %d\n", x);
new(&x) A();
printf("%d\n", x);
new(&x) B();
printf("%d\n", x);
}
输出是:
before: 7
7
0
为什么default ctor 零初始化int x?
【问题讨论】:
-
这是一个有趣的结果,但由于未定义行为的性质,这并不表明
B实际上初始化了它的x成员。例如,当我尝试它时,我得到了与您相同的结果,但是使用-O3我得到的输出看起来像A也将x初始化为零,但显然不需要:godbolt.org/z/cxrn1WcT9 -
我认为不是构造函数这样做,而是整数初始化,它是未定义的并且依赖于编译器
-
@vladon 从 C++11(我认为)开始,如果您为具有“默认默认 ctor”的类调用 new()(您的 B 类有一个)"the object is zero-initialized" 作为一种可能性值初始化。该页面上的案例2。然后它将被默认初始化,这是 A 和 B 的 NOP。
-
@Peter-ReinstateMonica 是的,但不是在星期六
-
@vladon 众所周知,StackOverflow 不工作——它避免工作,所以最好在安息日完成。
标签: c++ default-constructor value-initialization