我的意思可以用下面的例子来解释:
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相比,我期望为零。