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:
初始化器的语义如下.[...]
- 如果初始值设定项为(),则对象进行值初始化.
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()
Run Code Online (Sandbox Code Playgroud)
由于第5.3.4/15段的规定,这可以保证产生直接初始化:
创建类型对象的new-expression
T初始化该对象,如下所示:- 如果省略new-initializer,则默认初始化对象(8.5); 如果没有执行初始化,则该对象具有不确定的值.
- 否则,根据8.5的初始化规则解释new-initializer以进行直接初始化.
在您的情况下,新的初始化程序存在,它是().并指定使用一组空括号进行直接初始化以在第8.5/11段中产生值初始化:
初始化器为空的括号集的对象,即
(),应进行值初始化.[...]