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

Gur*_*pof 10 c++ shared-ptr c++11

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

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

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

Arn*_*rtz 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-initializer以进行直接初始化.

所以它是直接初始化的new POD().

§8.5,16:

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


Mik*_*our 8

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

是.

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

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


And*_*owl 8

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

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

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

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

::new(pv) T()
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

在您的情况下,新的初始化程序存在,它是().并指定使用一组空括号进行直接初始化以在第8.5/11段中产生值初始化:

初始化器为空的括号集的对象,即(),应进行值初始化.[...]