【问题标题】:What does initializer_list do?initializer_list 有什么作用?
【发布时间】:2016-04-29 16:25:12
【问题描述】:

我目前的任务是为我的教授提供给我们的特殊自定义课程创建定义;我从未见过使用中的 initializer_list,我的教授也没有仔细研究过它。它具体是做什么的?

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

}

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

【问题讨论】:

  • 你试过谷歌搜索吗?
  • 另外,别忘了在编译时至少支持 C++11。 -std=c++11-std=c++14.
  • 我做到了,但对我的问题有一个独特的答案仍然很有帮助。
  • 投反对票,因为没有研究工作。只需搜索该术语或在标准库参考中查找它就会告诉您您需要知道的一切。除了缺乏研究之外,您在这里没有“问题”。
  • 我实际上有 2 个问题。尽管我进行了研究,但另一个仍未解决的问题。

标签: c++ constructor initializer-list


【解决方案1】:

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

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

还有其他东西,在页面上详细介绍了here 以及它的用途。

【讨论】:

  • 感谢分享!另外,您知道为什么我在导入参数时出现错误提示“initializer_list 成员未声明”吗?
  • @Xari 你可能没有用 C++11 编译。
  • 嗨,我的 C++ 设置/GCC C++ 编译器/杂项标志中有这个 -> -c -fmessage-length=0 -std=gnu++11 -std=c++11跨度>
  • @Xari 检查你的 #include 并确保你有 #include &lt;initializer_list&gt; 并且你的编译器应该只使用 1 个 -std 标志, -std=c++11 是严格的 c++ 11 一致性,而-std=gnu++11 用于 c++ 11 与 gnu 扩展的一致性。我现在删除 -std=c++11,如果你的 gcc 是最新的,它默认设置为 -std=gnu++11
  • 是的,我愿意。我目前正在谷歌搜索错误。我也将它附加到我的设置中(并使用 #include 包含它
【解决方案2】:

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

当有人尝试对LinkedQueue&lt;T&gt; 进行列表初始化时,会调用函数LinkedQueue&lt;T&gt;::LinkedQueue(const std::initializer_list&lt;T&gt;&amp;),如下所示:

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

该语言会自动构造一个 std::initializer_list&lt;int&gt; 对象,该对象按顺序包含值 1、2、3。这个对象被传递给构造函数。构造函数返回后,用户期望新构造的LinkedQueue&lt;int&gt; 对象将依次包含值1、2、3。

您需要编写构造函数,这样这将是正确的。为此,您可以使用基于范围的 for 循环遍历 std::initializer_list&lt;T&gt; 对象并将值按顺序添加到列表中。假设您有一个 push_back 函数和一个有效的默认构造函数,这样的事情可能会起作用:

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

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

【讨论】:

  • 这里是否需要增加模板的复杂性?
【解决方案3】:

在 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});

初始化必须是同一类型:您不能在初始化列表中混合来自不同类型的值。

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多