问题标签 [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++ 聚合初始化来构造实现接口的类的实例吗?
我希望有人能给我为什么以下内容无法编译的技术细节,如果可能的话,一个解决方法。
我有一个名为 Foo 的现有结构,以及使用初始化列表创建 Foo 实例的代码。此代码编译并工作:
我希望 Foo 实现一个接口:
此代码不再编译,出现以下错误
(错误会根据您的确切编译器而变化。)
我找到了与聚合初始化相关的标准的这一部分:
[dcl.init.aggr]/1 聚合是一个数组或一个类(第 12 条),其中 1.1 没有用户提供的、显式的或继承的构造函数(15.1),1.2 没有私有或受保护的非静态数据成员(第 14 条)、1.3 没有虚函数 (13.3) 和 1.4 没有虚拟、私有或受保护的基类 (13.1)。
虽然我实际上不确定聚合初始化是否是这里发生的事情。有人可以解释正在发生的错误,如果可能的话,提供我可以对界面进行的更改吗?我有几个需要这个接口的现有结构,以及许多使用这种初始化形式的现有代码,我想尽可能少地重写它。谢谢!
c++ - c++11 initializer_list 不适用于嵌入对象的文字常量值?
我在 c++11 中有一个简单的程序:
g++-7 编译并给出错误:
我只是想知道如何使用文字常量声明 A 的对象,如何修复它?
非常感谢。
c++ - 在使用聚合初始化时,是否可以在地图中进行无副本 emplace?
有关如何在不复制地图值的情况下插入stdmap的信息,请参阅此答案。
从那个答案继续 - 假设我的Foo
类型看起来像这样:
然后像这样使用聚合初始化进行初始化
或者
是否有可能以某种方式放置到带有 type 的地图中?:
我知道我可以只写一个构造函数Foo
——但它可以用聚合初始化来代替吗?
链接到编译器资源管理器:
相关c++参考:
https://en.cppreference.com/w/cpp/container/map/try_emplace
https://en.cppreference.com/w/cpp/language/aggregate_initialization
c++ - 聚合列表初始化与另一个聚合对象
我有:
另一个聚合:
我想我们他们喜欢:
哪个不起作用。
更改DisplayConfig
为:
会起作用,但改变DisplayConfig
不是一种选择,访问 config.width
也不再起作用。
DisplayConfig{r.width, r.height, 32};
确实有效,但sintax类似于:
可能的?
c++ - c++11 努力理解为什么我不能统一初始化一个结构,但我可以初始化一个类似类型的 std::pair
给定以下代码:
此代码有效。但是,如果我取消注释已注释掉的行——它试图以info
与 std::pair 初始化相同的方式初始化一个结构,那么它就会失败。我想不通为什么...
得到的错误是:
链接到我的测试代码:这里(魔杖盒)
c++ - 使用空基类的聚合初始化时如何避免 {}
C++17 对基类的聚合初始化很棒,但是当基类仅提供一些功能(因此没有数据成员)时,它就很冗长。
这是最小的示例:
如上例所示,我必须提供 empty {}
,否则会出现编译错误。现场演示。如果我省略它:
任何解决方法或 C++17 之前的方法?
c++11 - C ++ 11私有成员的聚合初始化,是否正确?
在将私有成员作为参数传递给所有者的类函数时,通过聚合初始化来初始化私有成员是否正确?只需看下面的代码。
我检查了标准和网络,似乎没有确切的答案。看起来机制如下: * 大括号初始化程序是公共的,因此用户不会违反访问限制。* 从初始化程序到“S”的隐式转换对于“S”是内部的,因此对于编译器也很好。
问题是,标准、草案或至少 cppreference 中是否有对此行为的描述的参考?
c++ - 使用数组聚合初始化结构数组
在 C++ (14/17) 中,如何在没有硬编码的大括号括起来的初始化器列表的情况下初始化(大)结构数组?
例如,如果您需要大量初始化,或者直到运行时才知道初始化值,您会怎么做?好像没有这方面的帖子。我创建了一个简单的示例来说明我希望做的事情。希望有人可以解释如何做到这一点:
c++ - 如何避免为聚合初始化重新输入类型信息?
我有以下示例:
虽然此代码有效,但我想避免在A
聚合列表中对 ' 进行“重新输入”,但如果我将其排除在外,则演绎指南将失败:("cannot deduce template arguments for 'As'"
我想这是有道理的)。也许解决这个问题的一种方法是手写我需要的任何数量的推导指南,从那时起我可以A
在每个推导指南中写下类型(即:我需要的容器的每个尺寸都需要一个推导)。
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 基类初始化是通过构造函数进行的,而不是聚合。