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

前端之家收集整理的这篇文章主要介绍了C 11的构造函数中的花括号参数是什么前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > C++11 Fun with initializer lists,arrays,and enumerations5个
我从一些算法书籍中读到了一个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
        //...
}

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

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

解决方法

这是统一初始化,一个新的C 11功能.但是,它可以说是在你的例子中以正确的方式使用.它应该是:
Queue(const size_t &cap=8) : head(0),data(cap) {}
//                                                        ^^^^^

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

data{cap}

或者这样:

data({cap})

导致接受std :: initializer_list的构造函数被选中(初始化列表是C 11的另一个新特性,与大括号初始化紧密相关),导致向量初始化为一个元素,其值为cap.

您可以在此live example中验证上述声明(代码报告如下):

#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
}

猜你在找的C&C++相关文章