问题标签 [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 回答
2160 浏览

c++ - 可以使用 C++ 聚合初始化来构造实现接口的类的实例吗?

我希望有人能给我为什么以下内容无法编译的技术细节,如果可能的话,一个解决方法。

我有一个名为 Foo 的现有结构,以及使用初始化列表创建 Foo 实例的代码。此代码编译并工作:

我希望 Foo 实现一个接口:

此代码不再编译,出现以下错误

(错误会根据您的确切编译器而变化。)

我找到了与聚合初始化相关的标准的这一部分:

[dcl.init.aggr]/1 聚合是一个数组或一个类(第 12 条),其中 1.1 没有用户提供的、显式的或继承的构造函数(15.1),1.2 没有私有或受保护的非静态数据成员(第 14 条)、1.3 没有虚函数 (13.3) 和 1.4 没有虚拟、私有或受保护的基类 (13.1)。

虽然我实际上不确定聚合初始化是否是这里发生的事情。有人可以解释正在发生的错误,如果可能的话,提供我可以对界面进行的更改吗?我有几个需要这个接口的现有结构,以及许多使用这种初始化形式的现有代码,我想尽可能少地重写它。谢谢!

0 投票
1 回答
31 浏览

c++ - c++11 initializer_list 不适用于嵌入对象的文字常量值?

我在 c++11 中有一个简单的程序:

g++-7 编译并给出错误:

我只是想知道如何使用文字常量声明 A 的对象,如何修复它?

非常感谢。

0 投票
2 回答
482 浏览

c++ - 在使用聚合初始化时,是否可以在地图中进行无副本 emplace?

有关如何在不复制地图值的情况下插入

std::map 没有复制值

从那个答案继续 - 假设我的Foo类型看起来像这样:

然后像这样使用聚合初始化进行初始化

或者

是否有可能以某种方式放置到带有 type 的地图中?:

我知道我可以只写一个构造函数Foo——但它可以用聚合初始化来代替吗?

链接到编译器资源管理器:

https://godbolt.org/z/_Fm4k1

相关c++参考:

https://en.cppreference.com/w/cpp/container/map/try_emplace

https://en.cppreference.com/w/cpp/language/aggregate_initialization

0 投票
1 回答
66 浏览

c++ - 聚合列表初始化与另一个聚合对象

我有:

另一个聚合:

我想我们他们喜欢:

哪个不起作用。

更改DisplayConfig为:

会起作用,但改变DisplayConfig不是一种选择,访问 config.width也不再起作用。

DisplayConfig{r.width, r.height, 32};确实有效,但sintax类似于:

可能的?

0 投票
1 回答
101 浏览

c++ - c++11 努力理解为什么我不能统一初始化一个结构,但我可以初始化一个类似类型的 std::pair

给定以下代码:

此代码有效。但是,如果我取消注释已注释掉的行——它试图以info与 std::pair 初始化相同的方式初始化一个结构,那么它就会失败。我想不通为什么...

得到的错误是:

链接到我的测试代码:这里(魔杖盒)

0 投票
1 回答
537 浏览

c++ - 使用空基类的聚合初始化时如何避免 {}

C++17 对基类的聚合初始化很棒,但是当基类仅提供一些功能(因此没有数据成员)时,它就很冗长。

这是最小的示例:

如上例所示,我必须提供 empty {},否则会出现编译错误。现场演示。如果我省略它:

任何解决方法或 C++17 之前的方法?

0 投票
2 回答
277 浏览

c++11 - C ++ 11私有成员的聚合初始化,是否正确?

在将私有成员作为参数传递给所有者的类函数时,通过聚合初始化来初始化私有成员是否正确?只需看下面的代码。

我检查了标准和网络,似乎没有确切的答案。看起来机制如下: * 大括号初始化程序是公共的,因此用户不会违反访问限制。* 从初始化程序到“S”的隐式转换对于“S”是内部的,因此对于编译器也很好。

问题是,标准、草案或至少 cppreference 中是否有对此行为的描述的参考?

0 投票
1 回答
206 浏览

c++ - 使用数组聚合初始化结构数组

在 C++ (14/17) 中,如何在没有硬编码的大括号括起来的初始化器列表的情况下初始化(大)结构数组?

例如,如果您需要大量初始化,或者直到运行时才知道初始化值,您会怎么做?好像没有这方面的帖子。我创建了一个简单的示例来说明我希望做的事情。希望有人可以解释如何做到这一点:

0 投票
1 回答
177 浏览

c++ - 如何避免为聚合初始化重新输入类型信息?

我有以下示例:

链接到非工作示例

虽然此代码有效,但我想避免在A聚合列表中对 ' 进行“重新输入”,但如果我将其排除在外,则演绎指南将失败:("cannot deduce template arguments for 'As'"我想这是有道理的)。也许解决这个问题的一种方法是手写我需要的任何数量的推导指南,从那时起我可以A在每个推导指南中写下类型(即:我需要的容器的每个尺寸都需要一个推导)。

0 投票
0 回答
90 浏览

c++ - 如何在其聚合初始化程序中使用类静态对象的大小?

在 Win32 标准库中,使结构的第一个成员成为结构的大小是相当常见的习惯用法,如下所示:

如果我创建一个全局对象,那么有一个简单的初始化语法可以自动适应类型的变化a

我不想创建一个全局对象,而是希望我的对象成为结构的静态成员:

但此类代码的 MSVC 错误,抱怨b不是struct test1. 因此,我有两个相关的问题:

1. 为什么全局成员和类静态成员有区别?
2. 有解决办法吗?

有问题的类型来自 Win32 标头,因此我无法从wrapped_float. (如果有用的话,我可以使用派生类/结构。)

的明显变化

产生相同的结果。我已经在Godbolt上验证了这种现象并不取决于我使用 MSVC 编译的事实——唯一适用的编译器是 x86-64 Clang。总结一个 M(non-)WE,写

编辑,2019 年 7 月 26 日下午 3:10:问题 (1) 仍然悬而未决。 这个问题表明constexpr变量没有大小,但这与编译 的事实sizeof(a) 不符。

为了后代,我将总结到目前为止评论中提到的一些解决方法。

Paul Sanders 指出,如果你能保证你的类型名称不会改变,那么你可以写

如果您想减少对 的显式引用的数量wrapped_float,那么 NRVO 的以下作品,

对应的构造函数版本

直到 C++20 才起作用,b/c 基类初始化是通过构造函数进行的,而不是聚合。