initializer_list有什么作用?

时间:2016-01-22 23:03:08

标签: c++ constructor initializer-list

我目前的任务是为教授提供给我们的特殊自定义课程创建一个定义;我从未见过使用过initializer_list,我的教授也没有看过它。它到底是做什么的?

template<class T>
LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>& il) {

}

我必须定义构造函数,我将自己完成。我只是想知道这个参数是做什么的。此外,我的编译器一直告诉我找不到std :: initializer_list成员声明。我使用#include导入了它,但问题仍然存在。

3 个答案:

答案 0 :(得分:2)

它允许您使用{}初始化您的LinkedQueue。 如在

 LinkedQueue<char> theQueue = {'a','b','c','d','e','f','g','h' };

以及其他内容,详细信息here在关于它及其使用的网页上。

答案 1 :(得分:2)

std::initializer_list是一个类模板,它包含一系列初始化器,它具有非常小的接口,因为它的唯一目的是用于使用它包含的值序列初始化另一个对象。与std::vectorstd::deque不同,std::initializer_list不能用作通用容器。

当有人尝试列出初始化LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>&)时会调用函数LinkedQueue<T>,如下所示:

LinkedQueue<int> q {1, 2, 3};

该语言自动构造一个std::initializer_list<int>对象,该对象按顺序包含值1,2,3。该对象被传递给构造函数。构造函数返回后,用户希望新构造的LinkedQueue<int>对象按顺序包含值1,2,3。

您需要编写构造函数,以使其成立。为此,您可以使用基于范围的for循环遍历std::initializer_list<T>对象,并按顺序将值添加到列表中。假设你有一个push_back函数和一个有效的默认构造函数,那么这样的东西可能有用:

template<class T>
LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>& il): LinkedQueue() {
    for (const T& val : il) {
        push_back(val);
    }
}

这将委托默认构造函数来设置类不变量,然后按顺序插入给定的初始值设定项。

答案 2 :(得分:1)

在C ++ 11中,初始化列表是一种在需要多个文字时为对象分配内容的方法。

例如,您可以初始化如下列表:

std::list<int> myList{1,2,3,4,5};

您可以编写您的类,因此它接受这样的语法。

作为极简主义示例,以下函数接受初始化列表:

void func( initializer_list<int> intList)
{
    for (auto i: intList) /*whatever*/;
}

// used as:
func({1,2,3,5});

初始化必须属于同一类型:您不能在初始化列表中混合使用不同类型的值。