`std :: make_shared <pod>()`值是否初始化了我的POD?</pod>

时间:2013-06-14 08:27:06

标签: c++ c++11 shared-ptr

std::make_shared<POD>()值是否初始化了我的POD?

如果是,这是否由标准保证?

如果没有(我怀疑),有没有办法做到这一点?我想std::make_shared<POD>(POD())会这样做,但这就是我应该做的事情吗?

3 个答案:

答案 0 :(得分:16)

是的,它的价值是初始化的,这由标准保证:

§20.7.2.2.6,2:(约make_shared

  

效果:分配适合T类型对象的内存,并通过展示位置新表达式::new (pv) T(std::forward<Args>(args)...)在该内存中构建对象。

§5.3.4,15:

  

创建类型为T的对象的new-expression初始化该对象,如下所示:
   - 如果省略new-initializer,则默认初始化对象(8.5);如果没有执行初始化,则该对象具有不确定的值    - 否则,新的初始化程序将根据8.5的初始化规则进行解释,以进行直接初始化。

因此它在new POD()中直接初始化。

<强>§8.5,16:

  

初始化器的语义如下。 [...]
   - 如果初始值设定项为(),则对象进行值初始化。

答案 1 :(得分:8)

  

std::make_shared<POD>()值是否初始化了我的POD?

  

如果是,这是否由标准保证?

C ++ 11 20.7.2.2.6 / 2指定它“构造该内存中的对象 通过放置新表达式::new (pv) T(std::forward<Args>(args)...)“。没有参数,这将是::new (pv) T(),它将对象初始化。

答案 2 :(得分:8)

  

std::make_shared<POD>()值是否初始化了我的POD?

,确实如此。关于std::make_shared<>()的第20.7.2.2.6 / 2段说:

  

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

如果没有传递参数,这意味着您的数据结构是这样构造的:

::new(pv) T()

由于第5.3.4 / 15段的规定,这可以保证产生直接初始化:

  

创建类型为T的对象的new-expression初始化该对象,如下所示:

     

- 如果省略 new-initializer ,则默认初始化对象(8.5);如果没有执行初始化,   该对象具有不确定的价值。

     

- 否则, new-initializer 将根据8.5的初始化规则进行解释,以进行直接初始化。

在您的情况下, new-initializer 存在且为()。并且在第8.5 / 11段中指定了使用一组空括号进行直接初始化以产生值初始化

  

一个对象,其初始化程序是一组空的括号,即(),应为值初始化。 [...]