2

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

#include <memory>

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

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

MyHandle 的聚合初始化是否发生所以 没有构造函数用于初始化 MyHandle 类型的对象?

4

3 回答 3

4

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

于 2012-11-26T09:36:22.710 回答
3

这是正确的。只有没有用户提供的构造函数的类才允许聚合初始化,并且(用标准的话来说,C++11 8.5.1/2),“每个成员都是从相应的初始化子句复制初始化的”。所以没有MyHandle使用构造函数,只为类类型的每个成员使用一个复制、移动或转换构造函数。

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

于 2012-11-26T09:53:58.093 回答
2

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

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

应该返回 0

于 2012-11-26T09:41:05.467 回答