如果我有一个结构并且我像这样初始化它:
#include <memory>
struct MyHandle
{
std::shared_ptr<int> handle_;
};
int main()
{
MyHandle m{std::make_shared<int>(42)};
}
MyHandle 的聚合初始化是否发生所以 没有构造函数用于初始化 MyHandle 类型的对象?
如果我有一个结构并且我像这样初始化它:
#include <memory>
struct MyHandle
{
std::shared_ptr<int> handle_;
};
int main()
{
MyHandle m{std::make_shared<int>(42)};
}
MyHandle 的聚合初始化是否发生所以 没有构造函数用于初始化 MyHandle 类型的对象?
MyHandle 不是 POD,因为 POD 不能包含非 POD 成员(并且 shared_ptr 不是 POD)。在构造 MyHandle 对象时肯定会调用 shared_ptr 的构造函数。
这是正确的。只有没有用户提供的构造函数的类才允许聚合初始化,并且(用标准的话来说,C++11 8.5.1/2),“每个成员都是从相应的初始化子句复制初始化的”。所以没有MyHandle
使用构造函数,只为类类型的每个成员使用一个复制、移动或转换构造函数。
默认初始化每个成员的隐式默认构造函数用于默认和值初始化;但它不能用于聚合初始化,因为每个成员只能初始化一次。
显然 std::shared_ptr 不是 POD,您可以使用std::is_pod检查 POD 类型:
std::is_pod<std::shared_ptr<int>>::value
应该返回 0