问题标签 [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 投票
2 回答
1020 浏览

c++ - 通过显式构造函数初始化数组

我正在编写一个具有带const char*参数的显式构造函数的类。对于这个问题的意图和目的,它看起来像这样:

现在我想编写一个用于初始化数组(数组/向量/列表——我不关心确切类型)的示例,并且我需要该示例尽可能清晰和简洁。理想情况下,它看起来像这样:

由于显式关键字而无法编译,我不准备将构造函数设为隐式。

我怎样才能完成这项工作,重点是使示例代码尽可能具有表现力?

编辑:在 Caleth 的帮助下,我选择了 Bolov 的解决方案:

0 投票
2 回答
891 浏览

c++ - 聚合初始化原子成员

似乎没有办法使用 C++14 来初始化原子成员。以下不起作用(在 gcc 8.0.1 上运行):

错误信息:

这是因为原子类型既不可复制也不可移动,因此不可复制初始化。然而,以下似乎有效(生活在 gcc 8.0.1 上)。

这有效地执行零初始化,因此无法初始化为零以外的值。有没有办法初始化为其他指定的值?

0 投票
1 回答
131 浏览

c++ - 在通用模板代码中初始化聚合成员

例如,

我能想到的方法及其局限性。

  1. node<T> v{ T(forward<Us>(args)...) }. 这涉及复制初始化,如果T不可复制且不可移动,例如原子类型,则复制初始化将无法工作。

  2. node<T> v{ {forward<Us>(args)...} }. 这涉及复制列表初始化,如果所选构造函数是显式的,则该初始化将无法工作。例如,node<unique_ptr<int>> n{ {new int()} }不起作用。

我想如果我能以某种方式直接初始化(例如,直接列表初始化)聚合成员,问题就解决了。然而,除了编写用户提供的构造函数、制作非聚合类型之外,我没有发现这是怎么可能的node,这太过分了,我不愿意这样做。任何的想法?

0 投票
0 回答
89 浏览

c++ - std::vector 和 std::array 之间是否存在聚合初始化差异?

std::array中,我们可以简单地这样表述

或者甚至在与 -Wall 一起铿锵声中,它们只需要更明确的表达,必须添加更多像这样的子对象大括号

说到std::vector, 一种方法是像他的一样显式地构造每个子对象。

如果我们尝试像这样汇总

它仅在clang中有效,但在gcc中是错误的


std::vector和之间是否存在聚合初始化差异std::array?如果是,为什么?

按照标准,gcc 是否应该像 clang 那样编译该聚合?

godbolt.org/g/TRZHnu

0 投票
1 回答
54 浏览

c++ - 聚合关系 - 从单独的 .cpp/.h 中初始化私有内的类

所以我试图创建一个银行账户程序,它本质上将使用两个独立的类,这些类从一个名为统计的单独 .cpp/.h 程序(statistics.cpp/statistics.h)派生我已将头文件包含在适当的位置并确保我没有犯任何区分大小写的错误。向前进。我遇到的问题是我收到一个错误-“警告:未设置未使用的变量'withdrawals'。” -“警告:未设置未使用的变量‘存款’。”

我已经在我的 statistics.cpp 中适当地创建了我的构造函数/重载构造函数

以及在我的 statistics.h 文件中定义它

在我的 bankaccount.h 文件中,我添加/创建了两个单独的类以尝试建立聚合关系。

这就是我在 bankaccount.cpp 中初始化和设置类的方式

这是统计 .cpp/.h add(); 功能

0 投票
1 回答
1414 浏览

c++ - 具有 char 数组的 C++ 结构以不寻常的方式初始化为零

遇到了一段不常见的 c++ 初始化代码,它似乎可以与以下代码一起正常工作......

这是将这些字符数组初始化为零的可接受方法吗?

0 投票
1 回答
76 浏览

c++ - 聚合初始化 pre-C++17

考虑以下由聚合组成的类层次结构:

现在,假设我想从 Foo 类型的对象初始化 Bar 类型的对象,为i. (由于这里讨论的乏味,添加一个构造函数Bar接受FoointBarFoo以任何其他方式修改 or 的定义是不可能的)。在 C++17 中,我会使用聚合初始化:

这在 C++14 中不可用。我还能做些什么来模仿 C++14 中的期望行为吗?我试图避免类似的事情

我要避免的事情是make了解内部结构Foo- 即make知道如何初始化 的额外成员很好Bar,但不希望初始化BarFoo.

0 投票
0 回答
60 浏览

c++ - 在数组的初始化中使用前一个元素的值

所以我发现这段代码有效

这正式合法吗?我以为我在initializer_list这里做一个,但如果我可以访问以前初始化的元素,这一定是在做聚合初始化。

我试图找到有关此合法性的官方声明,但我似乎找不到。

0 投票
2 回答
674 浏览

c++ - std::array 派生类聚合初始化

我正在制作一个派生自std::array. 很明显,构造函数不继承,它负责大括号初始化;例如:

参数的数量必须完全匹配,所以我倾向于在构造函数中使用可变参数函数参数(因为我不仅每次都在数组中使用 2 个元素)。使用它,我将如何将可变参数包转发给std::array构造函数?我对其他允许转发到std::array构造函数的大括号初始化方法持开放态度。

注意:std::initializer_list需要运行时初始化,我正在寻找一种编译时间/constexpr 兼容的方法。谢谢你。

0 投票
2 回答
651 浏览

c++ - 同时具有聚合初始化和模板推导

背景:

C++17 有两个很棒的特性:聚合初始化模板类型推导(针对类)。聚合初始化允许您在不复制或移动字段的情况下实例化字段,并且模板类型推导使您不必指定参数的类型。

下面Wrapper代码中的类就是一个例子。只要HAVE_MOVE_AND_COPY未定义,它就有聚合初始化,但是模板类型推导不起作用。

另一方面,如果定义了HAVE_MOVE_AND_COPY 则模板类型推导有效,但聚合初始化中断。我怎么能两者兼得?

例子:

没有发生移动或复制,但您没有模板扣除:

有模板扣除,但VocalClass被移动:

没有HAVE_MOVE_AND_COPY, 模板类型推导中断:

问题

有什么方法可以同时进行模板类型推导和聚合初始化?