从这个问题为什么我不能用大括号括起来的初始值设定项列表构造队列/堆栈?(C++11),我们知道用单花括号构造队列是行不通的。因为队列是容器适配器,它没有带有初始值设定项列表的构造函数。
但是,为什么下面的方法会起作用?双花括号是否使用容器参数调用队列的构造函数?因此内部花括号{"hello"}被视为vector<string>?
queue<string> q{{"hello"}}; //Question: why init with double curly braces?
Run Code Online (Sandbox Code Playgroud)
如果您查看此std::queue构造函数引用,您将发现没有采用初始值设定项列表的重载。
然而,底层容器存在过载。
所以这里发生的是,外部{}对用于构造std::queue对象,内部{}对用于隐式创建底层容器,然后将其传递到队列。
简而言之:
std::queue<std::string> q{{ "hello" }};
Run Code Online (Sandbox Code Playgroud)
有点相当于:
std::deque<std::string> temporary_container{ "hello" };
std::queue<std::string> q{ temporary_container };
Run Code Online (Sandbox Code Playgroud)
[请注意,默认容器std::queue是std::deque]