问题标签 [list-initialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
411 浏览

c++ - Braced-init-lists 和函数模板类型推演顺序

我有一个关于函数模板参数类型推导程序的问题。

举个例子:

如果我理解正确,则推断第二个参数std::istream_iterator是调用默认构造函数的类型。

适当的std::vector构造函数声明为:

由于第一个参数类型被推导为std::istream_iterator<int>第二个参数也被推导std::istream_iterator<int>,因此可以应用统一的初始化语义。我不知道的是类型推导发生的顺序。我真的很感激这方面的一些信息。

提前致谢!

0 投票
2 回答
535 浏览

c++ - 为什么可变参数函数不能“吃掉”C++11 中的列表初始化参数?

示例代码是:

emplace()有签名的地方,比如:

表示该gcc函数需要 0 个参数 - 提供 2 个。clang表示该函数需要 1 个参数 - 提供 2 个参数。

我什至不明白 - 这段代码有什么问题?

0 投票
2 回答
1770 浏览

c++ - 模板化结构的大括号括起来的初始值设定项列表

我在这里有点茫然。错误出现在 emplace_back 行上,不知道如何解决。任何帮助或提示将不胜感激,谢谢。

编辑

gcc 版本 4.8.2

问题在于结构初始化= {0}emplace_back.

0 投票
2 回答
372 浏览

c++ - 哪些语言规则允许 C++11 推断这是一个 initializer_list 对?

在 C++11 中,初始化 a 似乎是合法的std::map<std::string, int>,如下所示:

直观地说,这是有道理的——大括号括起来的初始值设定项是字符串对的列表,并且std::map<std::string, int>::value_typestd::pair<std::string, int>(可能有一些条件const

但是,我不确定我是否理解打字在这里的工作原理。如果我们去掉这里的变量声明并且只使用大括号括起来的初始化器,编译器就不会知道它正在查看 a,std::initializer_list<std::pair<std::string, int>>因为它不知道大括号对表示std::pairs。因此,似乎编译器以某种方式推迟了将类型分配给大括号封闭的初始值设定项的行为,直到它从std::map构造函数中获得足够的类型信息以实现嵌套大括号用于对。我不记得在 C++03 中发生过这样的事情;据我所知,表达式的类型从不依赖于它的上下文。

哪些语言规则允许此代码正确编译并允许编译器确定用于初始化列表的类型?我希望得到具体参考 C++11 规范的答案,因为这真的很有趣!

谢谢!

0 投票
2 回答
127 浏览

c++ - C++11 统一初始化(即列表初始化)不能通过继承编译

上面的代码没有编译,并给出:

即使我删除“构造函数”行也是如此。如果我删除=标志,即D obj {1};它给出如下:

解决此类问题的正确语法是什么?

0 投票
1 回答
268 浏览

c++ - 如何初始化 std::array 的对象, 2>?

我正在尝试初始化事物类型的对象:

我得到:

同上

和其他几件事。

0 投票
2 回答
649 浏览

c++ - 如何防止 std::string 使用 initializer_list 构造函数?

std::string在使用与其他基本类型相同的初始化时,我希望以下代码输出“test”而不是“X” 。std::string现在用 an 调用构造函数,因此调用了forinitializer_list的模板特化。getchar

有没有一种很好的方法可以在不破坏变量初始化的一致外观的情况下做到这一点?

0 投票
1 回答
461 浏览

c++ - 嵌套列表初始化与将 initializer_list 作为第二个参数的构造函数不匹配

我正在开发能够用 C++ 描述一些 XML 文件的语义的数据结构。想法是检查各种元素的存在和/或正确顺序,同时将它们包含的文本存储到 QHash 对象中,其中 QString id(基于元素名称,但可自定义)作为键。

由于 XML 支持嵌套,我希望能够反映这种嵌套。所以每个 XML 元素要么由“名称”和(可选)“id”描述,这意味着它是最终的叶子,它的文本将被解析,或者“名称”和其他元素描述符的列表,这意味着应该有这些当前元素内的嵌套元素。

由于会有很多这样的语义方案,我希望描述它们的各个实例的代码非常紧凑。

我的想法是有一个类,它描述一个元素并且可以通过 c++ std::initializer_list 文字构造,我希望隐式支持嵌套。各种重载的构造函数,以后可以设置各种特定的细节。

我快到了,但现在卡住了。即使constructor(std::initializer_list<ProtocolDescriptorTestNode >);
对于每个嵌套的花括号,通常都会调用带有签名的构造函数,但constructor(QString, std::initializer_list<ProtocolDescriptorTestNode >);
永远不会调用类似的签名构造函数,即使我将构造像
{ "xyz", { {"abc", "123"}, {"def","456"} } }
初始化器文字那样放置。

请查看以下与测试代码分开的代码片段并帮助我理解:
1. 这是正常的 c++11 行为,std::initializer_list 不支持这种与其他数据类型参数结合的嵌套。
2. 这是 gcc 中的实现问题(bug ;))(我使用的是 4.9.1 版(Debian 4.9.1-1))
3. 我忽略了代码语法/语义中的一些非常愚蠢的细节。

类声明(相关构造函数摘录):

相关构造函数的定义:

测试对象实例:(注意:隐式/显式数据类型转换 char * / QString 没有区别)

以及调试输出的相关部分,显示靠近"B"文字的初始化部分被视为node(QString("B")node(std::initializer_list)连接,而不是node(QString("B"), std::initializer_list)我的意图:

0 投票
1 回答
158 浏览

c++ - 初始化列表中的对象初始化问题

我有以下代码:

在示例中,如果我传递给 res 变量列表,它会编译,否则在直接使用初始化列表的情况下,它会失败http://ideone.com/8jYsDY

我想这与涉及 initializer_list 时类型推导的工作方式有关。如果这是符合标准的,那么一些参考会很好。

0 投票
2 回答
458 浏览

c++ - 使用较少子句的结构聚合初始化,为什么它会初始化所有内容?

如果我有一个常见的 linux 结构,例如:

我执行聚合初始化:

为什么这会将每个成员初始化为 0?

我的意思是:文档说:

如果初始化器子句的数量少于成员的数量或初始化器子句完全为空,则剩余的成员由它们的大括号或等号初始化器初始化,如果在类定义中提供,否则 (C++14 起)通过空列表执行值初始化。

为了简单起见:为什么这段代码打印 0?