问题标签 [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.
c++ - 如何将完美转发与大括号括起来的初始化程序结合起来
此代码编译:
以及该:
但是这个没有:
原因是第三个调用tuple(const Types&...)
,但这似乎是一个任意限制。
C++11 是否无法用可变参数模板表达这一点,还是有可能?
c++ - 编译器认为“A(A&)”暂时接受右值?
我有这个代码
令我惊讶的是,这在 GCC 和 Clang 中失败了。Clang 例如说
f
当第二个工作正常时,他们为什么选择第一个f
?如果我删除第一个f
,则调用成功。对我来说更奇怪的是,如果我使用大括号初始化,它也可以正常工作
他们都叫第二个f
。
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
c++ - 为什么我不能大括号初始化从另一个结构派生的结构?
当我运行此代码时:
我得到:
为什么大括号初始化适用于基类而不适用于派生类?
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 可以正确接受。
我承认,措辞不是特别清楚。那么,哪个编译器在处理第三个片段时是正确的?大括号省略是否发生在列表初始化中,还是没有?
c++ - C 样式数组的替代方案有多可行?
既然我们有了std::array
,std::vector
和大括号初始化,还需要 C 风格的数组吗?
c++11 - 结构的大括号初始化
在下面的代码中
我可以将第一个结构初始化为
但第二个失败了
是什么赋予了 ?
编辑:编译器错误是
版本:
构建命令:
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
要为大括号初始化器推导出一个类型,但不允许模板这样做?虽然“这可能是原因”形式的推测性解释很有趣,但我对那些知道标准为何如此编写的人的解释特别感兴趣。
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++ 委员会认为这种语法毫无价值时,有一点不同。所以这一定有什么特别的原因吗?非常感谢。