为什么在使用花括号初始化列表时首选 std::initializer_list 构造函数?

2024-01-08

考虑代码

#include <iostream>

class Foo
{
    int val_;
public:
    Foo(std::initializer_list<Foo> il)
    {
        std::cout << "initializer_list ctor" << std::endl;
    }
    /* explicit */ Foo(int val): val_(val)
    {
        std::cout << "ctor" << std::endl;
    };
};

int main(int argc, char const *argv[])
{
    // why is the initializer_list ctor invoked?
    Foo foo {10}; 
}

输出是

ctor
initializer_list ctor

据我了解,价值10被隐式转换为Foo (first ctor输出),然后初始化构造函数启动(第二个initializer_list ctor输出)。我的问题是为什么会发生这种情况?不是标准构造函数吗Foo(int)更好的匹配?也就是说,我预计这个片段的输出只是ctor.

PS:如果我标记构造函数Foo(int) as explicit, then Foo(int)是唯一被调用的构造函数,作为整数10现在不能隐式转换为Foo.


§13.3.1.7 [over.match.list]/p1:

当非聚合类类型的对象T是列表初始化的 (8.5.4),重载决策分两个阶段选择构造函数:

  • 最初,候选函数是类的初始化列表构造函数(8.5.4)T参数列表包括 初始化列表作为单个参数。
  • 如果没有找到可行的初始化列表构造函数,则再次执行重载决策,其中候选函数全部为 类的构造函数T参数列表包括 初始化列表的元素。

如果初始值设定项列表没有元素并且T有一个默认值 构造函数,第一阶段被省略。在复制列表初始化中, 如果explicit选择构造函数,初始化是 格式不正确。

只要有一个可行的初始化列表构造函数,当使用列表初始化并且初始化列表至少有一个元素时,它就会胜过所有非初始化列表构造函数。

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

为什么在使用花括号初始化列表时首选 std::initializer_list 构造函数? 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 为什么我的数组中的某些值未定义

    我在 php 中有一个 for 循环 它在我的页面上添加了许多复选框 如下所示
  • 如何从 v-text 字段或 v-input 字段中删除下划线

    我尝试从 Vuetify 中的 v input v text 或 v autocomplete 字段中删除下划线 但我找不到如何 有没有办法从 Vuetify 中的 v input v text 或 v autocomplete 字段中删除
  • jQuery UI 自动完成在输入字段中显示值而不是标签

    jQuery UI 自动完成的一个潜在的简单问题困扰着我 我的来源是 var ac label One Thing value One Thing label Two Thing value Two Thing 我正在调用小部件 funct
  • 如何创建通用数组? [复制]

    这个问题在这里已经有答案了 我不明白泛型和数组之间的联系 我可以使用泛型类型创建数组引用 private E elements GOOD 但无法创建具有泛型类型的数组对象 elements new E 10 ERROR 但它有效 eleme
  • 如何使用 getattr 从模型中获取外键值

    我有一个模型Project我通过以下指令获得了它的属性 attr getattr project id None project是实例 id是场并且None是默认的返回类型 我的问题是 如果我想用这个来获取外键怎么办 获取客户姓名 proj
  • NPM:运行 npm 时找不到 npm-cli.js

    通常我可以使用安装库npm但是今天安装 yeoman 时遇到了这个错误 请帮忙找出根本原因 D Works phonegap ionic todo gt npm install g yo module js 340 throw err Er
  • SELECT 上触发触发器

    我是触发器新手 在从 sql server 中的数据库表中选择值时需要触发触发器 我尝试过在插入 更新和删除时触发触发器 选择值时有什么方法可以触发触发器吗 我知道只有两种方法可以做到这一点 而且都不是触发器 您可以使用存储过程来运行查询并
  • Angular 4 - 在下拉列表中选择默认值 [Reactive Forms]

    在 Angular 4 中 我在 json 配置文件中定义了以下配置 countries USA UK Canada default UK 我需要使用反应性模块在下拉列表中显示这些 这是执行此操作的代码 ts countries strin
  • 温斯顿:了解日志记录级别

    阅读和摆弄温斯顿 我很困惑为什么日志记录级别按原样排序 以及为什么传输以它们的方式运行 好吧 至少是控制台 如果有人能够 甚至可能彻底 用真实的用例示例解释为什么使用 Winston 进行日志记录会以这种方式工作 我将不胜感激 例如 我像这
  • std::sort 算法内存使用

    我想知道标准库排序算法 例如 std sort 是否使用堆内存进行排序 是否有任何可靠的来源如何找出排序算法或任何标准库算法一般使用哪种类型 堆 堆栈 和多少临时内存 背景是我考虑将一些标准库算法引入嵌入式环境 其中受控的内存使用至关重要
  • 为什么单击对附加元素不起作用?

    我想使用 jQuery 将一些 html 元素从一个容器无休止地移动到另一个容器append函数 但是当我单击已附加的元素时 单击事件将不再触发 基于与我类似的一些线程 我发现附加元素已从其事件侦听器中剥离 我怎样才能避免这种情况 有人可以
  • 将本地核心数据移动到 iCloud

    如何在已使用本地存储 Core Data 的应用程序中启用 iCloud Core Data 我尝试过使用NSPersistentStoreUbiquitousContentNameKey在我的持久存储选项中 不幸的是 此选项启用 iClo
  • 为什么找不到主类?

    我有一个非常简单的代码 package mygame public class RunGame public static void main String args System out println args 0 我可以编译该代码 但
  • 如何向 Swift Playground 添​​加 UIButton?

    所以我打开了 Playground 我只想添加一个简单的 UIButton 或简单的 UIView 用于测试目的 但我无法让它显示 这是我到目前为止所拥有的 import UIKit var uiButton UIButton button
  • 使弹性项目采用内容宽度,而不是父容器的宽度

    我有一个容器 div with display flex 它有一个孩子 a 我怎样才能让孩子出现 内联 具体来说 如何使子级的宽度由其内容决定 而不扩展到父级的宽度 我尝试过的 我将孩子设置为display inline flex 但它仍然
  • .NET SDK 安装不正确

    我在安装 NET SDK 时遇到问题 首先当我进入 Visual Studio 2019 时 它说我缺少 dotnet Runtime sdk 所以我按照它的要求安装了它并重新启动了我的计算机 然后我再次进入 Visual Studio 2
  • 拦截 iOS 上的崩溃

    描述 我想捕获 iOS 应用程序中发生的所有异常并将它们记录到文件中 并最终将它们发送到应用程序使用的后端服务器 我一直在阅读有关此主题的内容 并发现了设备发送的信号的用法并对其进行了处理 但我不确定它是否会违反应用程序商店审查指南 或者可
  • 带悬停的 CSS 动态导航 - 如何使其在 iOS Safari 中工作?

    在我的网站中 我使用纯 CSS 动态菜单 这在桌面浏览器中没问题 但在 iOS iphone ipad 等 上不行 因为触摸界面不支持 hover选择器 我的问题是 在 iOS 上支持此功能的最佳方式是什么 理想情况下 可以通过修补一些 C
  • 将键值对添加到 JavaScript 中的对象数组中?

    如果我有一个这样的数组 var myarray myarray push Name Adam Age 33 myarray push Name Emily Age 32 这给了我一个数组 我可以在其中提取值 例如myarray 0 Name
  • 为什么在使用花括号初始化列表时首选 std::initializer_list 构造函数?

    考虑代码 include