Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 聚合初始化_C++ - Fatal编程技术网

C++ 聚合初始化

C++ 聚合初始化,c++,C++,如果我有一个struct,并且像这样初始化它: #include <memory> struct MyHandle { std::shared_ptr<int> handle_; }; int main() { MyHandle m{std::make_shared<int>(42)}; } #包括 结构MyHandle { std::共享的ptr句柄; }; int main() { myhandlem{std::mak

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

#include <memory>

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

int main()
{
        MyHandle m{std::make_shared<int>(42)};
}
#包括
结构MyHandle
{
std::共享的ptr句柄;
};
int main()
{
myhandlem{std::make_shared(42)};
}

MyHandle的聚合初始化是不是因为没有构造函数用来初始化MyHandle类型的对象?

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

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

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

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


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

伙计们,我稍微编辑了一下我的问题,让自己更清楚。基本上,我要问的是:在任何时候,会不会有任何MyHandle构造函数(在本例中是由编译器生成的)被执行,或者MyHandle是在没有构造函数的情况下初始化的?嗨,Mike,这是一个非常有趣的答案。你的回答与用户1600151在评论中给出的答案相矛盾(我不偏袒任何一方,我只是想知道到底发生了什么)。您介意并评论一下吗?@smallB我的意思是,自动生成的构造函数仍然存在,并且在您以其他方式创建MyHandle对象的情况下仍然会被调用,但是当您使用初始值设定项列表初始化它时,会绕过该构造函数。但是
MyHandle
是一个聚合,因此允许进行聚合初始化,这就是OP能够用大括号初始化它的原因。