问题标签 [aggregate-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++ - 在 c++20 中使用删除的默认构造函数初始化聚合
有一个包含 POD 的结构和已删除的默认构造函数。当使用-std=c++2a
. 相同的代码与-std=c++17
.
c++ - 使用声明中的元素类型隐式初始化 std::array
在下面的代码中,我试图初始化数组(原始 C-classic 和std::array
),以最小化元素类型的使用,即S
:
使用raw_array
I 只能指定S
一次。但是尝试相同的std::array
方法不起作用(请参阅评论std_array_no_type
)。我必须S
只为初始化列表中的第一个元素指定每个 or(这也是问题的一个有趣部分)的类型(请参阅 参考资料std_array_one_type_only
)。
那么,有没有办法只使用一次类型来定义一个初始化std::array
对象S
?如果不是,根据标准的哪个条款?为什么S
允许std_array_one_type_only
编译单个显式类型?
c++ - Visual Studio 2019 无法正确处理动态结构数组的聚合初始化
如果使用 VC++ 2017 编译,下面的代码将打印垃圾(或零),如果使用 GCC 或 Clang ( https://rextester.com/JEV81255 ) 编译,则打印“1122”。是 VC++ 的错误还是我在这里遗漏了什么?
同时,如果元素是原始类型(如int
),它也可以工作。
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++ - P1008(“禁止与用户声明的构造函数聚合”)在实践中何时有用?
P1008(“禁止使用用户声明的构造函数进行聚合”)已成为 C++20 标准的一部分,以防止在使用聚合初始化时出现意外行为:
我同意上述X x2{3};
声明不应编译。然而,我遇到的所有证明 P1008 的例子根本不现实——它们纯粹是句法,基本上没有意义//foo
代码片段。bar
baz
P1008在实践中解决了什么问题?我发现很难想象我最终会如何X
在一个真实的程序中写出类似上面的东西。
在 C++17 聚合中删除默认构造函数而不提供其他构造函数来初始化它对我来说似乎是不现实的。
c++ - C++ - 围绕结构构建包装类,其语法与结构相同
这是我之前的问题的后续: C++ - Constructing wrapper class with same syntax as Wrapped data
基本上,我试图围绕一些数据制作一个包装器模板,并使用与数据相同的语法构造/设置包装器。
如果我使用类似结构的东西,我可以通过转发参数来实现,所以语法可以是:
问题是,这仅在我在结构中定义了该构造函数时才有效。我可以让它工作而不必定义它吗?
包装器当前如下所示:
c++ - 可能平凡可构造类型的聚合初始化。隐藏基类可能吗?
我正在尝试实现类似压缩对的东西,并希望它可以轻松构建。我试图通过以下方式做到这一点:
在只考虑性能的地方,在某些可以使用微不足道的可构造性或空基类优化的情况下,这实际上比 std::pair 更好地进行基准测试。然而,这个实现的一个大问题是它只能在对元素基类型被公共继承的情况下进行聚合初始化,这很烦人,因为可以调用对元素的函数等等。有没有办法显式隐藏所有基函数和成员,或者有没有办法支持聚合初始化而没有公共基类型并且不放弃空基类优化或如果 A 和 B 是可构造的琐碎可构造性?
c++ - 在 C++17 中计算具有 POD 类型的普通数组的字段?
我从几个片段中收集了以下内容,使用测试聚合初始化能力的技术,并将结构转换为元组以计算大小,但是当有一个数组时,结构可以被大括号省略并使结构化绑定不正确。在 C++17 中是否有任何解决方法/其他技巧?
c++ - 隐藏空基类以进行聚合初始化
考虑以下代码:
这就是你必须初始化 B 的方式:B<int, 3> b = { {}, {1, 2, 3} };
我想避免基类不必要的空 {}。Jarod42 here提出了一个解决方案,但是,它不适用于元素默认初始化:B<int, 3> b = {1, 2, 3};
很好但B<int, 3> b = {1};
不是:b.data[1]
并且b.data[2]
没有默认初始化为0,并且会发生编译器错误。有什么方法(或者会有 c++20)从构造中“隐藏”基类?