聚合初始化

时间:2012-11-26 09:33:30

标签: c++ pod

如果我有一个结构,我就像这样初始化它:

#include <memory>

struct MyHandle
{
        std::shared_ptr<int> handle_;
};

int main()
{
        MyHandle m{std::make_shared<int>(42)};
}

是否发生了MyHandle的聚合初始化,因此 no constructor 用于初始化MyHandle类型的对象?

3 个答案:

答案 0 :(得分:4)

MyHandle不是POD,因为POD不能包含非POD成员(而shared_ptr不是POD)。在构造MyHandle对象时,肯定会调用shared_ptr的构造函数。

答案 1 :(得分:3)

这是对的。聚合初始化仅允许没有用户提供的构造函数的类,并且(用标准的话说,C ++ 11 8.5.1 / 2),“每个成员都是从相应的initialiser-clause复制初始化的”。因此,不使用MyHandle的构造函数,只为类类型的每个成员使用复制,移动或转换构造函数。

默认初始化每个成员的隐式默认构造函数用于默认和值初始化;但它不能用于聚合初始化,因为每个成员只能初始化一次。

答案 2 :(得分:2)

显然std :: shared_ptr不是POD,您可以使用std::is_pod来检查POD类型:

std::is_pod<std::shared_ptr<int>>::value

应该返回0