问题标签 [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.

0 投票
1 回答
107 浏览

c++ - GCC 不支持新表达式中的大括号省略

考虑这个程序:

我认为主函数中的所有四个变量都应该使用聚合初始化来初始化。

但是,GCC 只接受s_arrand i_arr,但拒绝s_newand 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_newinew我可以理解这一点,因为两者S[1]都是int[1][1]聚合类型,其元素类型是子聚合(数组的数组S;数组的数组)。但是,C++ 允许省略这些大括号,并且 GCC 接受s_arri_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_arri_arr也是直接初始化的,我认为它们应该以相同的方式解释,并且原始程序应该是格式良好的。

我在这里有什么遗漏,或者这是 GCC 中的错误吗?

我试图通过 GCC Bugzilla 进行搜索,但没有找到任何相关内容。

0 投票
1 回答
96 浏览

c++ - 在 C++17 中计算具有 POD 类型的普通数组的字段?

我从几个片段中收集了以下内容,使用测试聚合初始化能力的技术,并将结构转换为元组以计算大小,但是当有一个数组时,结构可以被大括号省略并使结构化绑定不正确。在 C++17 中是否有任何解决方法/其他技巧?

0 投票
2 回答
159 浏览

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”是完整的初始化,所有其他的都是大括号省略的。这就是造成歧义的原因。

所以问题是:我该如何解决这个问题?还是有更好的方法/解决方案?