c++ 11的构造函数中的花括号形参是什么?

What is the curly bracket parameter in the constructor of C++11

本文关键字:形参 是什么 构造函数 c++      更新时间:2023-10-16

我从一些算法书中读到一个Queue的实现,有一个片段对我来说是新的/有趣的,我不理解。我认为这是新的东西,就像c++ 11中vector的初始化列表一样,但由于代码的上下文,我不那么自信。有人能解释一下或者提供一些参考吗?

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
        //...
}

有问题的部分是data({cap}),这是什么?它将向量的大小调整为cap?(显然,代码的作者打算在构造数据时给它一个大小上限)

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

这是统一初始化, c++ 11的新特性。然而,在您的示例中,它的使用方式是正确的。应该是:

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

因为目的是调用std::vector<>的构造函数,该构造函数接受vector的初始大小。以这种方式调用它:

data{cap}

或者这样:

data({cap})

导致构造函数接受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
}