C++20 中的指定初始值设定项

2023-11-24

我有一个关于 c++20 功能之一的问题,指定初始化程序(有关此功能的更多信息here)

#include <iostream>

constexpr unsigned DEFAULT_SALARY {10000};

struct Person
{
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person
{
    unsigned salary{DEFAULT_SALARY};
};

int main()
{
    std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed
    std::cout << std::boolalpha << std::is_aggregate_v<Employee> << '\n'; // true is printed

    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // it's ok
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile, WHY ?

    // For e2 compiler prints a warning "missing initializer for member 'Employee::<anonymous>' [-Wmissing-field-initializers]"
    Employee e2 {.salary{55000}}; 
}

该代码是用 gcc 9.2.0 编译的-Wall -Wextra -std=gnu++2a flags.

正如你在上面看到的,两个结构,Person and Employee是聚合但初始化Employee使用指定的初始值设定项不可能进行聚合。

有人可以解释一下为什么吗?


根据 C++ 20 标准(9.3.1 聚合。第 #3 页)

(3.1) — 如果初始化列表是指定初始化列表,则 骨料应属于类别类型,每个指示符中的标识符 应命名类的直接非静态数据成员,以及 聚合的显式初始化元素是 是或包含这些成员。

因此,您不能使用指定的初始值设定项列表来初始化基类的数据成员。

使用通常的列表初始化,例如

Employee e1{ "John", "Wick", 40, 50000 };

or

Employee e1{ { "John", "Wick", 40 }, 50000 };

or as @Jarod42指出您可以写的评论

Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };

在这种情况下,直接基类由指定的初始化器列表初始化,而整个类 Employe 由非指定的初始化器列表初始化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++20 中的指定初始值设定项 的相关文章

  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 如何使用 ASP.NET MVC 编辑多选列表?

    我想编辑一个如下所示的对象 我希望用 UsersGrossList 中的一个或多个用户填充 UsersSelectedList 使用 mvc 中的标准编辑视图 我只得到映射的字符串和布尔值 下面未显示 我在 google 上找到的许多示例都
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • iinc 在 Java 中是原子的吗?

    我知道在没有锁定的情况下 C 中的增量操作不是原子的 JVM 会在其实现上添加任何锁吗iinc操作说明 不 这不对 检索 c 的当前值 将检索到的值加 1 将增加的值存储回 c 中 原子性和线程干扰的 Java 文档 你需要使用synchr
  • 使用 JMS 连接到 IBM MQ

    我想使用 JMS 连接到 IBM MQ 如何指定队列管理器 通道和其他属性 使用 JNDI 进行连接工厂 目的地查找 提供InitialContext具有以下属性 java naming provider url
  • “无法重现”——Java 确定性多线程可能吗?

    是否可以以确定性方式运行多线程 Java 应用程序 我的意思是在我的应用程序的两次不同运行中始终具有相同的线程切换 原因是每次运行时都在完全相同的条件下运行模拟 类似的情况是 当使用随机数生成器时给出一些任意种子以获得始终相同的 随机 序列
  • Rshinydashboard动态菜单选择

    我在 R闪亮仪表板中创建了动态 sibebar 菜单 即使我使用selected TRUE 在此动态模式下启动时不会选择与菜单关联的菜单项 如何确保我可以控制在这种动态模式下启动时显示哪个 menuItem 的内容 我一直在搜索类似的帖子
  • 如何强制 WebKit 重绘/重绘以传播样式更改?

    我有一些简单的 JavaScript 来实现样式更改 sel document getElementById my id sel className sel className replace item 1 9 selected item
  • 关于 Apple 的 LazyTableImages 示例的问题 - 行为与应用程序商店不完全相同

    我有一个带有项目列表的 UITableView 每个项目都有自己的图像 我认为 Apple 的 LazyTableImages 示例项目非常适合学习 并用于在检索原始列表数据后实现异步下载图像的同类过程 在大多数情况下 它运行得很好 除了我
  • 在控制器中执行操作的 Rails 3 链接或按钮

    在 RoR 3 中 我只想有一个链接 按钮来激活控制器中的某些操作 方法 具体来说 如果我单击页面上的 update specs 链接 它应该转到我的产品控制器中的 update specs 方法 我在此网站上找到了执行此操作的建议 lin
  • 如何比较一个字符来检查它是否为空?

    我尝试了下面的方法 但是 Eclipse 抛出了一个错误 while s charAt j null 检查字符是否是的正确方法是什么null 检查是否String s is not null在进行任何字符检查之前 返回的字符String c
  • 学说迁移,使用自定义学说类型的问题

    我正在使用 Symfony2 Doctrine2 构建一个应用程序 我的应用程序需要存储地理空间数据 因此我编写了适当的学说扩展 一切都运行得很好 并且该应用程序已经在生产环境中运行了很长时间 现在我必须添加一些新功能 并且需要更新数据库而
  • MVC DateTime 验证 - 英国日期格式

    我有一个简单的视图 其中包含两个日期字段 并添加了 ValidationMessageFor 控件以进行不显眼的 JavaScript 验证 我的问题是 当格式正确时 dd MM yyyy 我总是被告知我的日期无效 我已经添加了
  • IIS7 - 在 ASP 中指定内容长度标头会导致“连接重置”错误

    我正在将一系列网站从现有的 IIS5 服务器迁移到全新的 IIS7 Web 服务器 其中一个页面从数据库中的 blob 中提取数据文件并将其提供给最终用户 Response ContentType rs contentType Respon
  • 可以使用 Fetch API 作为请求拦截器吗?

    我尝试在每次使用 Fetch API 向服务器发出请求后运行一些简单的 JS 函数 我已经搜索过这个问题的答案 但没有找到任何答案 可能是因为 Fetch API 相对较新 我一直在这样做XMLHttpRequest像这样 function
  • 如何将准备好的语句与 PHP 事务结合使用?

    我的目标是同时使用事务和准备好的语句 以实现数据完整性和防止 SQL 注入 我有这个 try cnx new PDO dsn dbuser dbpass cnx gt setAttribute PDO ATTR ERRMODE PDO ER
  • 对象属性赋值与解构?

    我想用ES6 解构分配对象的属性 但无法弄清楚语法 var dst already in existence with its own props methods etc var src a foo b bar c baz dst a sr
  • 图像变换会产生红色图像?

    我正在尝试通过水平翻转图像并调整其大小来转换图像 问题是 当转换完成后 图片的颜色都很奇怪 它已经变成了微红色调 是否有可能以某种方式解决这个问题 我想我在某处读到这可能是 AWT 库中的一些错误 但我不确定 这是代码 import jav
  • 模板内类型名分配的目的是什么

    我遇到过这段代码 我试图包含所有详细信息 以防我遗漏某些内容 template lt typename TYPE TYPE with an arbitrarily long name typename KIND KIND with an a
  • 斯康斯。使用 Glob 进行递归

    我使用 scons 几天了 有点困惑 为什么没有内置工具用于从给定根开始递归构建源 让我解释 我有这样的源码配置 src Core folder1 folder2 subfolder2 1 Std folder1 等等 这棵树可能更深 现在
  • mysql 中的文本索引与整数索引

    无论如何 我一直尝试在表上使用整数主键 但现在我怀疑这是否总是必要的 假设我有一个产品表 每个产品都有一个全球唯一的 SKU 编号 这将是一串 8 16 个字符的字符串 为什么不把这个作为PK呢 通常 我会将此字段设为唯一索引 但随后使用自
  • 在php中调整图像的透明度

    我已经仔细研究了在调整 png 大小时如何正确管理 alpha 我设法让它保持透明度 但仅限于完全透明的像素 这是我的代码 src image imagecreatefrompng file dir this gt file name ds
  • C++20 中的指定初始值设定项

    我有一个关于 c 20 功能之一的问题 指定初始化程序 有关此功能的更多信息here include