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

Lin*_*gxi 22 c++ initialization language-lawyer c++11

我所说的意思可以通过以下示例来解释:

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

int可变缺省初始化(因此具有垃圾值)或值初始化(从而具有零的值)?我已经在GCC 5.2和clang 3.6上进行了测试,前者进行了值初始化,后者进行了默认初始化.我想知道标准对此有何看法?在我看来,现代C++肯定应该在这种情况下执行值初始化.

For*_*veR 23

是.

N3797 20.8.2.2.6

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

所以,这将是

::new (pv) int();
Run Code Online (Sandbox Code Playgroud)

依此类推N3797 8.5.1

表单中发生的初始化

T x(a);
T x{a};
Run Code Online (Sandbox Code Playgroud)

以及在新表达式(5.3.4)中称为直接初始化.

初始化器的语义如下.目标类型是要初始化的对象或引用的类型,源类型是初始化表达式的类型.如果初始化程序不是单个(可能带括号的)表达式,则不定义源类型.

- 如果初始化程序为(),则对象进行值初始化.

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

- 否则,对象被零初始化.

新铿锵和​​GCC都同意这个标准:Live


小智 6

该标准似乎支持您的意见.

从20.8.2.2.6开始:

通过放置new-expression :: new(pv)T(std :: forward(args)...)在该内存中构造一个对象

由于new int()是初始化的值,与new int相比,我预计会为零.