显式默认的默认构造函数和聚合

2024-02-11

当我编译时如何解释差异#if 0 and #if 1以下代码的版本:

#include <cstdlib>

struct A
{ 
    explicit A() = default; // explicitly defaulted or deleted constructors are allowed for aggregates (since C++11)
#if 1
private :
#endif
    int i;
};

int
main()
{
    A a = {};
    return EXIT_SUCCESS;
}
  • for #if 0一切正常,编译成功。
  • for #if 1 compilation failed with error message:

    错误:选择的构造函数在复制初始化中是显式的

表达方式有什么区别A a = {};取决于是否A是聚合还是非聚合?


TL;DR:Clang 和 GCC 拒绝您的代码是错误的。CWG 1630 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1518无论选择的默认构造函数如何,该决议都使默认初始化格式良好explicit or not.


In the variation of your code in which i is private, A is not an aggregate, as these cannot have private members. As long as i is public, however, A is an aggregate1, and no constructor is invoked since aggregate initialization is performed (see blue box), so your constructor being explicit is irrelevant.

但是,一旦引入私有成员,就需要按照红框进行值初始化。因此 [dcl.init]/(8.2) 适用:

[dcl.init]/(7.1) 定义了这种情况的默认初始化:

§13.3.1.3 给出

对于[...]默认初始化,候选者 函数是对象所在类的所有构造函数 已初始化。

任何时候都不会考虑原始上下文(复制或直接初始化)。 (§13.3.1.7 也不适用。)事实上,这是有意为之的;看CWG #1518 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1518:

该问题已通过决议解决第1630期 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1630: 默认初始化现在使用 13.3.1.3 [over.match.ctor],它现在允许使用显式构造函数进行默认初始化。

Clang 和 GCC(和 VC++)尚未实现相应的 DR,因此拒绝 C++14 模式下的代码是不正确的。


1) Your class has a user-declared constructor, but it isn't user-provided, i.e. not impeding your class from being an aggregate. Recall the definition in [dcl.init.aggr]/1:

An 总计的是一个数组或一个类(第 9 条),没有用户提供 构造函数 (12.1),没有私有或受保护的非静态数据成员 (第 11 条),无基类(第 10 条),无虚函数 (10.3)。

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

显式默认的默认构造函数和聚合 的相关文章

  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • Spring AOP:仅建议使用上下文 Bean?

    我是 Spring AOP 的新手 我尝试使用方面进行日志记录 这是我的配置 方面 Aspect public class LoggerAspect Pointcut execution aop LoggerAspTest private
  • 如何在不安装条形码扫描仪应用程序的情况下使用ZXing库

    我一直在开发一个 Android 应用程序来扫描条形码和 QR 码并将结果发送到其他应用程序 HTTP 我已经通过互联网阅读了大部分文档 并在 stackoverflow 中阅读了它并使其正常工作 我可以在我的设备上运行独立的 zxing
  • 原则 2 多级继承

    我在多级继承方面遇到一些麻烦 ORM Entity ORM Table name et date ORM InheritanceType JOINED ORM DiscriminatorColumn name type type strin
  • Android 对话框 - 自定义背景而不是变暗或模糊

    我创建了自己的自定义对话框 它工作正常 但我想将变暗的背景更改为自定义图案 例如图像文件或 xml 形状 我怎样才能做到这一点 请注意 我不想改变调光强度 但我只想用一种模式替换这种调光 我找到了解决这个问题的方法 我从 vipul mit
  • 动态创建 Yii FormModel 对象 (CFormModel)

    我正在开发一个涉及在高抽象级别生成表单的应用程序 它是一个 CMS 应用程序 我想动态创建 CFormModel 对象并即时设置表单字段 我想我可以通过扩展 CFormModel 然后动态创建代表表单字段的类属性 Yii 行话中的 属性 来
  • 从 url 加载 Rdata 文件

    我在加载文件时遇到困难 因此它不会丢失其尺寸 所以这就是我现在所处的位置 gt mood data lt read table http www psychology mcmaster ca bennett psy710 datasets
  • 检查 android.graphics.path 与其自身的交集

    我想检查路径是否与自身相交 如果是 则碰撞在 x y 只是为了突出显示 我如何检查一条路径是否与另一条路径相交也非常有趣 这是一个屏幕截图 可以更好地解释我的意思 https i stack imgur com JrEmN png http
  • Visual Studio Cordova:打包 IOS 应用程序时,如何将配置文件添加到 XCode 的“构建设置”的代码签名部分?

    使用 Visual Studio Cordova 时 我按照以下说明将应用程序发布到 Apple App Store http taco visualstudio com en us docs tutorial package publis
  • iOS 连接数据库的正确架构?

    我是一名 Web 开发人员 正在着手创建移动 iOS Android 应用程序 因此 我想要了解的是应该如何构建移动应用程序来访问 发布 更新 删除 存储在中央服务器上的数据 出于说明目的 假设我正在创建一个移动食谱应用程序 名为 MyRe
  • 为 Selenium 创建 HTTP Basic auth Chrome 扩展(MWE 可用)

    我正在尝试使用 Google Chrome 运行 Selenium 测试 我希望使用 HTTP 基本身份验证登录 这在 Selenium 中没有实现 因此建议加载扩展 我正在使用来自的代码 https github com RobinDev
  • Linq to SQL 外键

    数据库表的 DDL Users id int identity name varchar unique PCs id int idnetity name varchar unique userid FK to Users Apps id i
  • 将哈希表转换为字符串数组

    如何将哈希表转换为字符串数组 假设 l table 是一个哈希表 如果我尝试 l array l table format table 那么 l array 是一个数组 但是一个 FormatEntryData 对象的数组 如果我做 str
  • 多线程环境下的增量和减量

    我正在尝试在多线程环境中 int 变量的经典增量 减量 这是我的示例代码 public class SyncIncDec public static void main String args SyncCounter count new S
  • 用 Pig Latin 每组写入一个文件

    问题 我有许多包含 Apache Web 服务器日志条目的文件 这些条目不按日期时间顺序排列 并且分散在文件中 我正在尝试使用 Pig 读取一天的文件 按日期时间对日志条目进行分组和排序 然后将它们写入以其包含的条目的日期和小时命名的文件中
  • Obj-C++:用于识别 Objective-C 类的模板元函数?

    使用 Objective C 我可以写一个 C IsObjectiveCClass
  • iPhone 中的语音识别?

    我见过很多应用程序在 iPhone 上进行语音识别 我已经解决了 stackoverflow 的以下问题 iPhone 应用程序 添加语音识别 https stackoverflow com questions 942312 iphone
  • 如何使用 core_bluetooth 获取公共蓝牙设备地址

    我们有一台蓝牙设备 蓝牙设备有一个公共蓝牙设备地址 BDA 在 Android 中 它们像蓝牙一样 30 03 5B 00 15 12 我只能获取设备名称和设备UUID 像这样 void centralManager CBCentralMa
  • Dart WebUI 构建错误

    我在将 web ui 添加到现有的 dart 应用程序时遇到问题 我什至没有将任何 webui 特定代码添加到我的 html 文件中 我只是尝试构建 我将 web ui 添加到 pubspec yaml 并运行 pub install 当我
  • 在php中取消设置编码数组后,json没有索引

    我希望任何人都可以帮助我 我的 JSON 不是indexed 即元素上方没有任何键 nome LABORGHINI GALLARDO descrizione LAMBORGHINI GALLARDO ED NERA ANNO 2007 in
  • 显式默认的默认构造函数和聚合

    当我编译时如何解释差异 if 0 and if 1以下代码的版本 include