C++ 11的构造函数中的花括号参数是什么

Pei*_* Li 7 c++ c++11

我从一些算法书籍中读到了一个Queue的实现,有一个对我来说是新的/有趣的片段,我不明白.我认为它是像C++ 11中的向量初始化列表一样的新东西,但由于代码的上下文,我不是那么自信.任何人都可以光明或提供一些参考?

template <typename T>
class Queue {
    private:
        size_t head, tail, count;
        vector<T> data;
    public:
        Queue(const size_t &cap=8) : head(0),tail(0),count(0),data({cap}) {}
        //... more interfaces
        //...
}
Run Code Online (Sandbox Code Playgroud)

可疑部分是数据({cap}),这是什么?它将矢量调整为容量上限?(显然,代码的作者打算在构造数据时给出数据大小.)

编辑:在阅读第一个答案和测试后,我们知道该书在代码段中有错误.它打算给出一个初始上限,但它使用了错误的{}.

And*_*owl 4

这就是统一初始化,C++11 的一项新功能。但是,可以说在您的示例中以正确的方式使用了它。它应该是:

Queue(const size_t &cap=8) : head(0),tail(0),count(0),data(cap) {}
//                                                        ^^^^^
Run Code Online (Sandbox Code Playgroud)

因为目的是调用std::vector<>接受向量初始大小的构造函数。这样调用它:

data{cap}
Run Code Online (Sandbox Code Playgroud)

或者这样:

data({cap})
Run Code Online (Sandbox Code Playgroud)

导致接受 an 的构造函数std::initializer_list被选取(初始化列表是 C++11 的另一项新功能,与大括号初始化密切相关),从而产生一个用值为 的单个元素初始化的向量cap

您可以在此实例中验证上述声明(代码如下):

#include <vector>

struct X
{
    X(int s) : v1({s}), v2{s}, v3(s) { }
    std::vector<int> v1;
    std::vector<int> v2;
    std::vector<int> v3;
};

#include <iostream>

int main()
{
    X x(42);
    std::cout << x.v1.size() << std::endl; // Prints 1
    std::cout << x.v2.size() << std::endl; // Prints 1
    std::cout << x.v3.size() << std::endl; // Prints 42
}
Run Code Online (Sandbox Code Playgroud)