问题标签 [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++ 中的聚合初始化还是默认初始化?
考虑以下程序。
它是使用聚合初始化还是默认初始化?我很困惑。
c++ - 为什么我可以从 {} 初始化常规数组,而不是 std::array
这有效:
的所有元素的arr
值初始化为零。
为什么这不起作用:
我从 g++(4.8.2 版)收到以下警告:
警告:成员 'std::array<int, 10ul>::_M_elems'</p> 缺少初始化程序
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)。
那么,为什么上面这行代码不被解释为调用默认构造函数呢?
c++ - std::array<> 的初始化
考虑以下代码:
使用 gcc 编译:
NB1:注释掉第一个初始化语句,代码编译没有错误。
NB2:将所有初始化转换为构造函数调用会产生相同的结果。
NB3:MSVC2015 的行为相同。
我可以看到为什么第一次初始化无法编译,为什么第二次和第三次都可以。(例如参见C++11:正确的 std::array 初始化?。)
我的问题是:为什么最终的初始化会编译?
c++ - 这个 C++ C11 语法是什么:“= {}”?
我在一个 c++ 文件中遇到了这种语法:
它有什么作用?它只是调用默认构造函数吗?
c++ - 我可以引用初始值设定项列表的先前成员吗?
假设我想引用initializer_list
我已经定义的成员。我可以做吗?
此代码在 Visual Studio 和gcc中编译并给出预期的:“13 55” ,我只想知道它是合法的:
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
删除了默认构造函数,类内数据成员初始化器
c++ - 如果继承,不能使用初始化列表初始化结构?
我对我写的这段 (C++14) 代码感到困惑:
我很好地为D
自己编写了一个构造函数,但是我找不到一个很好的解释来解释为什么该结构D
不再可以使用初始化列表进行初始化。我所做的只是让它继承自一个完全空的类——我想我以某种方式让它表现得不像结构。
我的编译器究竟是如何处理结构C
的D
?
c++ - 具有不可复制成员的类的聚合初始化
假设我有一些删除了复制构造函数的类:
我在另一个类中使用这个类:
但是当我尝试使用聚合初始化时
编译器输出以下错误:
为什么聚合初始化需要类成员的复制构造函数?聚合初始化是否使用复制构造函数初始化所有成员?
c++ - 是否允许位域的聚合初始化?
我有一个包含位字段的结构:
我想知道我是否可以在它的位域上使用聚合初始化。例如:
我注意到这在 gcc 5.1和 Visual Studio 2015 中确实有效。我只是想证明这是标准批准的 C 和 C++ 初始化。