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

0 投票
3 回答
131 浏览

c++ - 这是 C++ 中的聚合初始化还是默认初始化?

考虑以下程序。

它是使用聚合初始化还是默认初始化?我很困惑。

0 投票
3 回答
2117 浏览

c++ - 为什么我可以从 {} 初始化常规数组,而不是 std::array

这有效:

的所有元素的arr值初始化为零。

为什么这不起作用:

我从 g++(4.8.2 版)收到以下警告:

警告:成员 'std::array<int, 10ul>::_M_elems'</p> 缺少初始化程序

0 投票
1 回答
2718 浏览

c++ - 空大括号是调用默认构造函数还是调用 std::initializer_list 的构造函数?

以下是来自Effective Modern C++(第 55 页)的引述:

“假设您使用一组空大括号来构造一个支持默认构造函数并且还支持 std::initializer_list 构造的对象。您的空大括号是什么意思?等等。规则是您获得默认构造。”

我用 std::array 试过这个:

并从 g++(版本 4.8.2)得到警告:

警告:成员 'std::array<int, 10ul>::_M_elems'</p> 缺少初始化程序

这是尝试std::array从空构造 an 时得到的警告std::initializer_list(有关此警告的讨论,请参阅为什么我可以从 {} 初始化常规数组,而不是 std::array)。

那么,为什么上面这行代码不被解释为调用默认构造函数呢?

0 投票
1 回答
2006 浏览

c++ - std::array<> 的初始化

考虑以下代码:

使用 gcc 编译:

NB1:注释掉第一个初始化语句,代码编译没有错误。
NB2:将所有初始化转换为构造函数调用会产生相同的结果。
NB3:MSVC2015 的行为相同。

我可以看到为什么第一次初始化无法编译,为什么第二次和第三次都可以。(例如参见C++11:正确的 std::array 初始化?。)

我的问题是:为什么最终的初始化会编译?

0 投票
3 回答
219 浏览

c++ - 这个 C++ C11 语法是什么:“= {}”?

我在一个 c++ 文件中遇到了这种语法:

它有什么作用?它只是调用默认构造函数吗?

0 投票
1 回答
1079 浏览

c++ - 我可以引用初始值设定项列表的先前成员吗?

假设我想引用initializer_list我已经定义的成员。我可以做吗?

此代码在 Visual Studio 和gcc中编译并给出预期的:“13 55” ,我只想知道它是合法的:

0 投票
3 回答
10819 浏览

c++ - 删除了默认构造函数。仍然可以创建对象...有时

对 c++11 统一初始化语法的天真、乐观和哦.. 如此错误的看法

我认为既然 C++11 用户定义类型对象应该使用新{...}语法而不是旧(...)语法构造(除了构造函数重载 forstd::initializer_list和类似参数(例如std::vector:size ctor vs 1 elem init_list ctor))。

好处是:没有狭窄的隐式转换,最麻烦的解析没有问题,一致性(?)。我认为没有问题,因为我认为它们是相同的(除了给出的示例)。

但他们不是。

一个纯粹疯狂的故事

{}调用默认构造函数。

... 除非:

  • 默认构造函数被删除并且
  • 没有定义其他构造函数。

然后看起来它宁愿值初始化对象?...即使对象已经删除了默认构造函数,{}也可以创建一个对象。这难道不是破坏了已删除构造函数的全部目的吗?

...除了以下情况:

  • 该对象有一个已删除的默认构造函数,并且
  • 定义了其他构造函数。

然后它失败了call to deleted constructor

...除了以下情况:

  • 该对象有一个已删除的构造函数,并且
  • 没有定义其他构造函数并且
  • 至少是一个非静态数据成员。

然后它因缺少字段初始化程序而失败。

但是你可以使用它{value}来构造对象。

好的,也许这与第一个异常相同(值初始化对象)

...除了以下情况:

  • 该类有一个已删除的构造函数
  • 并且至少有一个数据成员在类内默认初始化。

那么也不{}{value}不能创建对象。

我确定我错过了一些。具有讽刺意味的是,它被称为统一初始化语法。我再说一遍:UNIFORM初始化语法。

这是什么疯狂?

方案 A

删除了默认构造函数:

方案 B

删除默认构造函数,删除其他构造函数

方案 C

删除了默认构造函数,定义了其他构造函数

方案 D

已删除默认构造函数,未定义其他构造函数,数据成员

方案 E

删除了默认构造函数,删除了 T 构造函数,T 数据成员

方案 F

删除了默认构造函数,类内数据成员初始化器

0 投票
3 回答
367 浏览

c++ - 如果继承,不能使用初始化列表初始化结构?

我对我写的这段 (C++14) 代码感到困惑:

我很好地为D自己编写了一个构造函数,但是我找不到一个很好的解释来解释为什么该结构D不再可以使用初始化列表进行初始化。我所做的只是让它继承自一个完全空的类——我想我以某种方式让它表现得不像结构。

我的编译器究竟是如何处理结构CD

0 投票
1 回答
387 浏览

c++ - 具有不可复制成员的类的聚合初始化

假设我有一些删除了复制构造函数的类:

我在另一个类中使用这个类:

但是当我尝试使用聚合初始化时

编译器输出以下错误:

为什么聚合初始化需要类成员的复制构造函数?聚合初始化是否使用复制构造函数初始化所有成员?

0 投票
1 回答
697 浏览

c++ - 是否允许位域的聚合初始化?

我有一个包含位字段的结构:

我想知道我是否可以在它的位域上使用聚合初始化。例如:

我注意到这在 gcc 5.1和 Visual Studio 2015 中确实有效。我只是想证明这是标准批准的 C 和 C++ 初始化。