问题标签 [brace-elision]
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++ - GCC 不支持新表达式中的大括号省略
考虑这个程序:
我认为主函数中的所有四个变量都应该使用聚合初始化来初始化。
但是,GCC 只接受s_arr
and i_arr
,但拒绝s_new
and i_new
,报告(g++ 8.3.0 on Ubuntu):
(注意:最后一个重复行是由 g++ 产生的)
我也在godbolt上测试过,从 6.1 到 9.2 的 gcc 版本都不能编译这个程序。6.x 和 7.x 版本还给出消息说:“抱歉,未实现:无法使用初始化程序初始化多维数组” i_new
。
更改{0}
为{{0}}
解决了在 Godbolt 上测试的所有 GCC 版本(6.1 到 9.2)s_new
。inew
我可以理解这一点,因为两者S[1]
都是int[1][1]
聚合类型,其元素类型是子聚合(数组的数组S
;数组的数组)。但是,C++ 允许省略这些大括号,并且 GCC 接受s_arr
和i_arr
,其中这些大括号被省略。
另一方面,clang 6.0.0 到 clang 9.0.0 欣然接受原程序。
在 C++14 的规范中(gnu++14 是 GCC 6.5/7.4/8.3/9.2 的默认值),
5.3.4 新 / 17
创建 T 类型对象的 new 表达式按如下方式初始化该对象:
……
(17.2) — 否则,根据 8.5 的初始化规则解释 new-initializer 以进行直接初始化。
new-initializer 应该被解释为直接初始化。由于s_arr
和i_arr
也是直接初始化的,我认为它们应该以相同的方式解释,并且原始程序应该是格式良好的。
我在这里有什么遗漏,或者这是 GCC 中的错误吗?
我试图通过 GCC Bugzilla 进行搜索,但没有找到任何相关内容。
c++ - 在 C++17 中计算具有 POD 类型的普通数组的字段?
我从几个片段中收集了以下内容,使用测试聚合初始化能力的技术,并将结构转换为元组以计算大小,但是当有一个数组时,结构可以被大括号省略并使结构化绑定不正确。在 C++17 中是否有任何解决方法/其他技巧?
c++ - 如何使用 C++ 中的列表初始化器解决大括号省略的歧义?
我想为 3x3 矩阵制作自己的结构。我想允许通过组件/元素或“行”进行构造。
所以要么你提供一个std::array<float, 9>
或一个std::array<std::array<float, 3>, 3>
但是,当使用以下构造函数定义这样的结构时:
那么第二个构造函数与第一个构造函数有歧义。这意味着您可以像这样调用第二个构造函数
Matrix3x3{ {{ {{1.f, 2.f, 3.f}}, {{4.f, 5.f, 6.f}}, {{7.f, 8.f, 9.f}} }} };
没有任何问题,但是像这样调用第一个构造函数
Matrix3x3{ {{1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f}} };
将给出以下消息和错误:
Visual Studio 告诉我“有多个构造函数实例......与参数列表匹配”。
我测试了做同样的事情,但使用了一个整数数组(因为它更容易使用)和一个长度。考虑:
然后前 3 个有效并为第一个构造函数编译,而所有 5 个为第二个构造函数编译。
对于简单的数组构造函数“test3”是完整的初始化,其中第一对括号初始化聚合 ArrayTest,第二对初始化数组,第三对初始化该数组的第一个元素,最后第四个括号初始化整数 1 很少见,但有效。“test1”和“test2”只是“test3”的大括号省略版本。
对于 array-of-arrays 构造函数,“test5”是完整的初始化,所有其他的都是大括号省略的。这就是造成歧义的原因。
所以问题是:我该如何解决这个问题?还是有更好的方法/解决方案?