10

std::make_shared<POD>()值会初始化我的 POD 吗?

如果是,这是标准保证的吗?

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

4

3 回答 3

16

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

§20.7.2.2.6,2:(make_shared

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

§5.3.4,15:

创建 T 类型对象的 new 表达式按如下方式初始化该对象:
— 如果省略 new-initializer,则该对象是默认初始化的 (8.5);如果不执行初始化,则对象具有不确定的值。
否则,根据 8.5 的初始化规则解释 new-initializer 以进行直接初始化。

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

§8.5,16:

初始化器的语义如下。[...]
— 如果初始化程序是 (),则对象是值初始化的。

于 2013-06-14T08:46:57.550 回答
8

std::make_shared<POD>()值会初始化我的 POD 吗?

是的。

如果是,这是标准保证的吗?

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

于 2013-06-14T08:46:23.343 回答
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()

由于第 5.3.4/15 段,这保证产生直接初始化:

创建类型对象的 new 表达式T按如下方式初始化该对象:

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

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

在您的情况下,new-initializer存在并且它是(). 并且在第 8.5/11 段中指定了带有空括号的直接初始化以产生值初始化:

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

于 2013-06-14T08:48:44.340 回答