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

时间:2015-09-25 13:32:12

标签: c++ c++11 initialization language-lawyer

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

UNION ALL

auto p = std::make_shared<int>();变量是否默认初始化(因此具有垃圾值)或初始化值(因此值为零)?我已经在GCC 5.2和clang 3.6上进行了测试,前者进行了值初始化,后者进行了默认初始化。我想知道标准对此有何看法?在我看来,在这种情况下,现代C ++肯定应该执行值初始化。

2 个答案:

答案 0 :(得分:23)

N3797 20.8.2.2.6

  

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

在该内存中的对象

所以,这将是

::new (pv) int();

依旧于N3797 8.5.1

  

表单中出现的初始化

T x(a);
T x{a};
     

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

     

初始化器的语义如下。目的地类型是   正在初始化的对象或引用的类型以及源   type是初始化表达式的类型。如果初始化程序是   不是单个(可能带括号的)表达式,源类型是   没有定义。

     

- 如果初始值设定项为(),则对象将进行值初始化。

     

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

     

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

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

答案 1 :(得分:6)

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

从20.8.2.2.6开始:

  

通过放置new-expression :: new(pv)T(std :: forward(args)...)构建该内存中的对象

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