std::make_shared<POD>()
值会初始化我的 POD 吗?
如果是,这是标准保证的吗?
如果没有(我怀疑),有没有办法做到这一点?我想std::make_shared<POD>(POD())
会做,但那是我应该做的吗?
std::make_shared<POD>()
值会初始化我的 POD 吗?
如果是,这是标准保证的吗?
如果没有(我怀疑),有没有办法做到这一点?我想std::make_shared<POD>(POD())
会做,但那是我应该做的吗?
是的,它的值已初始化,这是由标准保证的:
§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:
初始化器的语义如下。[...]
— 如果初始化程序是 (),则对象是值初始化的。
std::make_shared<POD>()
值会初始化我的 POD 吗?
是的。
如果是,这是标准保证的吗?
C++11 20.7.2.2.6/2 指定它“通过放置新表达式在该内存中构造一个对象::new (pv) T(std::forward<Args>(args)...)
”。如果没有参数,那将是::new (pv) T()
,它对对象进行值初始化。
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 段中指定了带有空括号的直接初始化以产生值初始化:
初始化器为空括号集的对象,即 ,
()
应进行值初始化。[...]