从初始化列表转换为“A”将使用显式构造函数“A::A(int)”

2024-01-07

我正在尝试将旧的 C++03 代码库迁移到 C++11。但我无法理解 gcc 在以下情况下警告我的内容:

% g++ -std=c++03 t.cxx
% g++ -std=c++11 t.cxx
t.cxx: In function ‘int main()’:
t.cxx:8:21: warning: converting to ‘A’ from initializer list would use explicit constructor ‘A::A(int)’
    8 | int main() { B b = {}; }
      |                     ^
t.cxx:8:21: note: in C++11 and above a default constructor can be explicit
struct A {
  explicit A(int i = 42) {}
};
struct B {
  A a;
};
    
int main() {
  B b = {};
  return 0;
}

我在这里想做的只是基本的零初始化。这对于 C++03 似乎是合法的,但我无法理解如何在 C++11 中表达等价物。


作为参考,我正在使用:

% g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

给定的程序是不规范的原因如下所述。

C++20

B is an 总计的。既然你是not显式初始化a, dcl.init.aggr#5 https://timsong-cpp.github.io/cppwp/n4861/dcl.init.aggr#5适用:

  1. 对于非联合聚合,每个不是显式初始化元素的元素都按如下方式初始化:

5.2 否则,如果该元素不是引用,则该元素是从空初始化器列表复制初始化([dcl.init.list])。

这意味着a is 复制已初始化来自空的初始值设定项列表。换句话说,就好像我们在写:

A a = {}; // not valid see reason below

另请注意,复制初始化上下文中的列表初始化称为复制列表初始化这里就是这种情况。并从超过.match.list#1.2 https://timsong-cpp.github.io/cppwp/n4861/over.match.list#1.2:

在复制列表初始化中,如果选择显式构造函数,则初始化为不规范的.


归根结底,失败的原因在于A a = {};格式不正确。


C++11

Since B是一个聚合,并且列表中的初始化子句少于聚合中的成员,并且来自聚合初始化文档 https://en.cppreference.com/w/cpp/language/aggregate_initialization:

聚合初始化的效果是:

  • 如果初始值设定项子句的数量小于成员和基数 (C++17 起) 的数量或初始值设定项列表完全为空,则剩余的成员和基数 (C++17 起) 将由其默认成员初始值设定项进行初始化,如果在类定义中提供,否则 (C++14 起)从空列表复制初始化,按照通常的列表初始化规则(使用默认构造函数对非类类型和非聚合类执行值初始化,并对聚合执行聚合初始化)。

这再次意味着a is 复制已初始化从空列表中{}。也就是说,就好像我们在写:

A a = {}; // not valid see reason below

但从过度匹配函数 https://timsong-cpp.github.io/cppwp/n3337/over.match.funcs:

在复制列表初始化中,如果选择显式构造函数,则初始化为不规范的.

所以我们再次面临同样的问题,即A a = {};无效。


Solution

为了解决这个问题,我们可以通过A{} or A{0}作为列表内的初始值设定项,如下所示:

B b = { A{} };  //ok now 
B c = { A{0} }; //also ok

工作演示 https://godbolt.org/z/b6G4hve48.


Note

注意写A a{};另一方面是格式良好的,因为这是一个直接初始化上下文,所以它是直接列表初始化.

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

从初始化列表转换为“A”将使用显式构造函数“A::A(int)” 的相关文章

  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 当我尝试在 chrome 中创建书签时,控制台中出现错误“浏览器未定义”

    我正在尝试创建书签 在本例中是 chrome API 书签 创建 https developer mozilla org en US Add ons WebExtensions API bookmarks create 我的代码是 func
  • 使用基于视图的 NSOutline (Sourcelist) 的奇怪行为

    我的应用程序中有一个 Lion 中的新功能 基于视图的 NSOutlineView 作为侧边栏 SourceList 使用 CoreData NSTreeController Bindings NSOutlineView 和一个对象作为 N
  • 自定义条带结帐的错误处理

    我正在研究自定义条带集成 网关 如果我使用信用卡 借记卡付款 我将从该 url 获得带有令牌 id 的成功 json 响应https api stripe com v1 tokens https api stripe com v1 toke
  • .NET 4 中的 URL 重写?

    我听说 Visual Studio 2010 提供了使用其 URL 路由引擎进行 URL 重写的内置功能 我在 Visual Studio 的早期版本中使用像 intelligencia urlrewrite 这样的插件进行了 URL 重写
  • SVG 粘糊糊的效果在最新版本的 FireFox 上不起作用

    我有一个问题 当使用黑色以外的任何其他颜色时 我的 feGuassian 模糊无法正常工作 在 chrome 上它工作得很好 我还没有在 safari 上测试过 我在 jsFiddle 创建了一个示例 HTML div div class
  • 关于 django form.errors 的问题,获取原始错误消息

    django文档说https docs djangoproject com en dev ref forms api django forms Form errors https docs djangoproject com en dev
  • 从代码隐藏中获取多用户控件中的 GridView

    IpInterfaceUC 用户控制 div style height 205px width 550px margin left 5px div
  • 正则表达式 [A-z] 和 [a-zA-Z] 之间的区别

    我正在使用正则表达式为我只需要字母字符的文本框编写输入验证器 我想知道是否 A z and a zA Z 是否相同或性能方面是否存在差异 我继续阅读 a zA Z 在我的搜索中 没有提及 A z 我正在使用java的String match
  • 在android中制作按钮的按下效果

    我创建了一个android应用程序 它动态创建50个按钮 效果很好 但问题是当我动态地为这些按钮添加一些背景颜色时 按钮的按下效果会丢失 谁能告诉我一些保留按钮点击按下效果的解决方案我的代码如下所示 my Android平台是2 3 3 i
  • 流星 / JS 日期

    所以我试图在流星中制作一个时间表应用程序 创建项目并添加时间条目 为什么 这是我能想到的所有测试应用程序 但是 我更习惯于处理 PHP 在 PHP 中我只会存储一个带有时间长度的日期字段 现在 我想知道在 Meteor 中处理日期的最佳方式
  • ElasticSearch进入“只读”模式,节点无法更改

    晚上我的 ES 集群 由 5 个数据节点 3 个主节点组成 发生了一些事情 我不知道发生了什么 但所有索引和数据都被删除 集群进入 只读 模式 可能被黑客攻击了 When trying to get Kibana running I get
  • python:从html获取图像链接

    来自这样的 html rss 片段 div class div p a href alt src http link to image width a span 我想获取图像源链接 http link to image jpg 我怎样才能在
  • jQuery 中窗口调整大小事件触发两次

    我运行了下面的代码 document ready function var ivar 0 window resize function console log window height window height ivar 每当我调整大小
  • 是removeFromSuperview释放了对象吗?

    我在用removeFromSuperview用于从其超级视图中删除视图 我也在使用release after removeFromSuperview在该对象上 有时它工作正常 但有时会提供错误的访问权限 is removeFromSuper
  • BigCommerce webhook 未触发

    我能够成功为我的 BigCommerce 商店设置 Webhook 但是 我没有收到商店的任何请求 当我创建 webhook 时 我收到了以下响应 这让我认为它工作正常 id 437 client id dagb0rxpdd2o3znkeb
  • I18n 停止工作

    我总是使用这个脚本来编译 django po 并且它总是有效 bin sh django admin py makemessages a django admin py compilemessages 突然它停止工作 并出现以下错误 i18
  • Windows Phone 模拟器需要缺少 Hyper-V

    我是 Windows Phone 8 的初学者 我安装了 Windows Phone 8 SDK 当我启动模拟器时 出现此错误消息 Windows Phone 模拟器需要 Hyper V 您的 PC 缺少 运行 Hyper V 需要以下先决
  • 在我的混合模型上使用 lme4 预测函数时遇到问题

    我在尝试在混合模型上使用 lme4 预测函数时遇到了一些困难 在进行预测时 我希望能够将一些解释变量设置为指定水平 但对其他变量进行平均 以下是一些虚构的数据 它们是我的原始数据集的简化版 无意义版本 a lt data frame TLR
  • 设置自定义对话框的内容描述

    我怎样才能设置contentDescription当我的对话框打开时由辅助服务读取 我目前正在使用具有自定义布局的对话框来显示阻塞的加载屏幕和语音contentDescription是 警报 在这种情况下不合适 谢谢 您可以创建子类Dial
  • 从初始化列表转换为“A”将使用显式构造函数“A::A(int)”

    我正在尝试将旧的 C 03 代码库迁移到 C 11 但我无法理解 gcc 在以下情况下警告我的内容 g std c 03 t cxx g std c 11 t cxx t cxx In function int main t cxx 8 2