std::make_shared<POD>()
值是否初始化了我的POD?
如果是,这是否由标准保证?
如果没有(我怀疑),有没有办法做到这一点?我想std::make_shared<POD>(POD())
会这样做,但这就是我应该做的事情吗?
答案 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段中指定了使用一组空括号进行直接初始化以产生值初始化:
一个对象,其初始化程序是一组空的括号,即
()
,应为值初始化。 [...]