问题标签 [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 回答
398 浏览

c++ - 如何将完美转发与大括号括起来的初始化程序结合起来

此代码编译:

以及该:

但是这个没有:

原因是第三个调用tuple(const Types&...),但这似乎是一个任意限制。

C++11 是否无法用可变参数模板表达这一点,还是有可能?

0 投票
1 回答
2648 浏览

c++ - 编译器认为“A(A&)”暂时接受右值?

我有这个代码

令我惊讶的是,这在 GCC 和 Clang 中失败了。Clang 例如说

f当第二个工作正常时,他们为什么选择第一个f?如果我删除第一个f,则调用成功。对我来说更奇怪的是,如果我使用大括号初始化,它也可以正常工作

他们都叫第二个f

0 投票
3 回答
125 浏览

c++ - Why would they special-case certain initializer lists instead of treating them all the same?

Say I have a variable auto x that I want to initialize to 7 using brace initialization, simple:

Except I learned that x is NOT an integer, but an initialization list itself. Why? Is there a specific reason why the committee would decide that auto should grab the initialization list in the case of a single auto value, or do they expect us to just realize these shouldn't be used together. I cant seem to think of a possible reason i would want an initializer list to be stored into auto as opposed to the value

0 投票
4 回答
13564 浏览

c++ - 为什么我不能大括号初始化从另一个结构派生的结构?

当我运行此代码时:

我得到:

为什么大括号初始化适用于基类而不适用于派生类?

0 投票
2 回答
6833 浏览

c++ - std::array 初始化中的大括号省略

假设有一个std::array要初始化的。如果使用双括号也没关系:

在旧的聚合初始化中使用单大括号也是可以的,因为大括号省略会处理丢失的大括号:

但是,可以使用带有单括号的列表初始化吗?GCC 接受它,Clang 以“使用直接列表初始化时不能省略子对象初始化周围的大括号”来拒绝它。

标准中唯一提到大括号省略的部分是 8.5.1/12,它说:

当使用赋值表达式初始化聚合成员时,会考虑所有隐式类型转换(第 4 条)。如果赋值表达式可以初始化成员,则初始化该成员。否则,如果成员本身是子聚合,则假定大括号省略,并考虑使用赋值表达式来初始化子聚合的第一个成员。

8.5.1 具体是关于聚合初始化,所以这应该意味着 Clang 拒绝是正确的,对吧?没那么快。8.5.4/3 说:

类型 T 的对象或引用的列表初始化定义如下:

[…]

— 否则,如果 T 是一个聚合,则执行聚合初始化 (8.5.1)。

我认为这意味着与聚合初始化完全相同的规则,包括大括号省略、应用,这意味着 GCC 可以正确接受。

我承认,措辞不是特别清楚。那么,哪个编译器在处理第三个片段时是正确的?大括号省略是否发生在列表初始化中,还是没有?

0 投票
1 回答
298 浏览

c++ - C 样式数组的替代方案有多可行?

既然我们有了std::array,std::vector和大括号初始化,还需要 C 风格的数组吗?

0 投票
1 回答
1324 浏览

c++11 - 结构的大括号初始化

在下面的代码中

我可以将第一个结构初始化为

但第二个失败了

是什么赋予了 ?

编辑:编译器错误是

版本:

构建命令:

0 投票
3 回答
1543 浏览

c++ - 为什么大括号初始值设定项的自动和模板类型推导不同?

我知道,给定一个大括号初始值设定项,auto将推导出一个 类型std::initializer_list,而模板类型推导将失败:

我什至知道这在 C++11 标准中是在哪里指定的:14.8.2.5/5 bullet 5:

[如果程序有,这是一个非推导上下文] 一个函数参数,其关联参数是一个初始化列表 (8.5.4),但该参数没有 std::initializer_list 或对可能有 cv 限定的 std::initializer_list 的引用类型。[示例:

模板无效 g(T);

g({1,2,3}); // 错误:没有为 T 推导出参数

—<em>结束示例]

我不知道或不理解的是为什么存在这种类型推断行为的差异。C++14 CD 中的规范与 C++11 中的规范相同,因此标准化委员会可能不会将 C++11 行为视为缺陷。

有谁知道为什么auto要为大括号初始化器推导出一个类型,但不允许模板这样做?虽然“这可能是原因”形式的推测性解释很有趣,但我对那些知道标准为何如此编写的人的解释特别感兴趣。

0 投票
1 回答
197 浏览

expression - 为什么花括号初始化列表不是表达式?

当我阅读 C++11 标准的 page93 $5.1.2 时,它说在这种情况下使用支撑初始化列表是非法的:auto x=[]{return {1,2}} ; //错误:花括号初始化列表不是表达式

我找到了这两个主题,一个来自标准,另一个来自 N3681 提案。

第 397 页 $14.8.2.5:初始化列表参数导致参数被视为非推导上下文。和 $7.6.1.4:用新发明的类型模板参数 U 替换出现的 auto,或者,如果初始化程序是花括号初始化列表 (8.5.4),则用 std::initializer_list 替换。

虽然 N3691 提案建议“将大括号初始化的 auto 更改为不推断为初始化列表,并在大括号初始化器具有多个元素的情况下禁止大括号初始化 auto。”它说“返回一个大括号-列表不起作用,因为它不是表达式” http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3681.html

但是我没找到“Why is abraced-init-list not an expression?”可能和这个题目意思一样: 为什么我们不能自动推导出返回类型? 但是当他试图理解为什么 C++ 委员会认为这种语法毫无价值时,有一点不同。所以这一定有什么特别的原因吗?非常感谢。

0 投票
5 回答
224356 浏览

c++ - 为什么列表初始化(使用花括号)比其他方法更好?

为什么?