问题标签 [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++03 标准对在 ctor 初始化程序中初始化聚合(包括数组)有什么特别的说明吗?或者上述代码的无效是其他一些规则的必然结果?
- C++0x 初始化列表能解决问题吗?
PS请不要提及向量,boost::arrays,以及它们对数组的优越性,我很清楚。
c++ - C++0x 中的缩小转换。只是我,还是这听起来像是一个重大变化?
C++0x 将使以下代码和类似代码格式不正确,因为它需要a到 a的所谓窄化转换。double
int
我想知道这种初始化是否在现实世界的代码中被大量使用。此更改将破坏多少代码?如果您的代码完全受到影响,是否要在代码中解决这个问题?
参考见 n3225 的 8.5.4/6
缩小转换是隐式转换
- 从浮点类型到整数类型,或
- 从 long double 到 double 或 float,或从 double 到 float,除非源是常量表达式并且转换后的实际值在可以表示的值范围内(即使不能精确表示),或
- 从整数类型或无范围枚举类型到浮点类型,除非源是常量表达式并且转换后的实际值将适合目标类型并且在转换回原始类型时将产生原始值,或
- 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式并且转换后的实际值将适合目标类型并在以下情况下生成原始值转换回原来的类型。
c++ - 聚合初始化在 C++11 中何时有效?
假设我们有以下代码:
在这里,我相信 structA
不是聚合,因为它既有重要的构造函数,也有一个std::string
我认为不是聚合的成员。这大概意味着这B
也不是一个聚合。
但是我可以聚合初始化 B。此外,这可以在不调用复制或移动构造函数的情况下完成(例如ideone上的 C++0x GCC 4.5.1 )。
这种行为似乎是一种有用的优化,特别是对于组合没有廉价移动的大型堆栈类型。
我的问题是:这种聚合初始化在 C++0x 下何时有效?
编辑+跟进问题:
下面的 DeadMG 回答如下:
那根本不是聚合初始化,而是统一初始化,在这种情况下,这基本上意味着调用构造函数,并且不复制或移动可能是由 RVO 和 NRVO 完成的。
请注意,当我更改B
为以下内容时:
执行移动。
因此,如果这只是统一初始化并且只是调用构造函数并且没有做任何特别的事情,那么我如何编写一个允许忽略移动的构造函数?
或者 GCC 只是没有在有效的情况下忽略此处的移动,如果是这样,是否有编译器和优化设置可以忽略移动?
c++ - C++ 中的聚合初始化安全
假设我有以下结构:
并且在使用时,我想将sampleData
类型变量初始化为已知状态。
后来,我决定需要在我的sampleData
结构中存储额外的数据,如下所示:
z
我的理解是,从我的预数据结构中 遗留下来的两个字段初始化仍然是一个有效的语句,并且将被编译,用默认值填充缺失的字段。
这种理解正确吗?我最近一直在 Ada 工作,它也允许聚合初始化,但会将类似的问题标记为编译错误。假设我对上面 C++ 代码的假设是正确的,是否有一种语言结构可以将缺少的初始化值识别为错误?
c - 初始化数组/结构的语法不熟悉,求解释
我正在查看一家名为 OVP(类似于 qemu 的产品)的公司提供的“处理器建模指南”。在其中,有一个类似于以下的小代码片段:
我以前从未见过这样的语法。 删除了与 C++ 无关的内容
目前我没有能力下载/查看他们的东西来查看任何东西是如何定义的,因此我的问题。如果您认识这种语法,您可以权衡一下吗?
编辑
or1kDispatchTableC
是 type 指针的 typedef or1kDispatchTableCP
,但我仍然没有任何关于它的内容or1kDispatchTableCP
。
c - 当初始化器的数量多于数组大小时,会有什么行为?
我想知道当初始化器的数量超过数组大小时会发生什么,例如:
当然,我的编译器会警告它。我期待未定义的行为,但我在 C11 标准中没有找到任何关于它的条款。那么,我错过了什么吗?
c++ - 如何使用自定义结构初始化 boost::array?
我正在寻找一个不错的解决方案是如何boost::array
使用自定义用户结构和数据初始化静态。我的例子,我所期望的boost::array
,如下:
但是这段代码不起作用,
我错过了什么?
谢谢!
c++ - 使用 ={} 语法初始化结构时,幕后发生了什么?
根据评论稍微编辑调整示例
一些代码然后是问题(只是为了澄清,这是一个 C++ 问题):
这里有几个问题:
- 发生了什么神奇的事情,允许
MyStruct1
以这种方式初始化的实例 - 在 c++98 中有解决方法吗?
作为参考,我试图使用构造函数作为强制堆栈分配的结构为零初始化的一种方式,但我不想禁止这种初始化方式。
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++11 中私有继承聚合类的类的聚合初始化
考虑以下代码:
该derived d{1, 2, 3};
行使我的编译器(Clang 3.3)失败并出现错误“没有匹配的构造函数用于初始化'派生'”。为什么是这样?有没有办法derived
通过聚合初始化来初始化?