std::make_shared是否执行值初始化(GCC和clang不同意)



我的意思可以用下面的例子来解释:

auto p = std::make_shared<int>();

int变量是默认初始化(因此具有垃圾值)还是初始化值(因此具有零值)?我在GCC 5.2和clang 3.6上进行了测试,前者进行值初始化,后者进行默认初始化。我想知道标准是怎么说的?在我看来,在这种情况下,现代c++应该明确地执行值初始化。

N3797 20.8.2.2.6

为类型T的对象分配合适的内存,并构造一个通过放置new表达式::new (pv) T(std::forward<Args>(args)...)

这里是

::new (pv) int();

等N3797 8.5.1

表单

中的初始化
T x(a);
T x{a};

和new表达式(5.3.4)中的

被称为直接初始化。

初始化式的语义如下:目标类型为被初始化的对象或引用的类型以及源Type是初始化表达式的类型。如果初始化式是不是单个(可能带括号)表达式,源类型是没有定义。

—如果初始化器为(),则对象为值初始化。

T类型的对象进行值初始化意味着:

-否则,对象为零初始化。

并且新clang和GCC都同意这个标准:Live

这个标准似乎支持你的观点。

从20.8.2.2.6:

通过放置new-expression::new (pv) T(std::forward(args)…)

在内存中构造一个对象

由于new int()是值初始化的,与new int相比,我期望为零。

最新更新