为什么在使用花括号初始化列表时首选 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 构造函数? 的相关文章

  • 如何从更高级别启动用户级别的 Exe

    我希望一个进程始终在用户级别运行 当它由以管理员级别运行的安装程序 自定义 而不是 msi 启动时 或者当用户登录时 环顾四周 我不确定这是否可能 最简单的方法是有 2 个进程 一种是普通用户 它启动提升 管理进程 然后管理进程可以使用 I
  • C 语言中的套接字如何工作?

    我对 C 中的套接字编程有点困惑 You create a socket bind it to an interface and an IP address and get it to listen I found a couple of
  • 使用其他非依赖构造函数参数进行构造函数注入

    我是 IOC 容器的新手 我正在开始使用 NInject 如果您希望您的构造函数具有非服务且不需要由 IOC 容器实例化的参数 您该怎么办 例如 public class Person private readonly string nam
  • 枚举 EMF 时丢失文本

    我在列举发票 emf http www mediafire com kdjwvvo7odyvwa6并将其复制到另一个但文本丢失了 令人惊讶的是 当我将其输出到窗口时 它绘制得非常完美 int CALLBACK EnhMetaFileProc
  • 如何通过实体键添加/删除与实体框架的多对多关系?

    I tried using Entities e new Entities EntityKey key new EntityKey Entities Users UserId 20 User user new User EntityKey
  • .NET:EventHandler 竞争条件修复如何工作?

    以下模式用于在引发事件时避免竞争条件 以防另一个线程取消订阅 MyEvent 使其为空 class MyClass public event EventHandler MyEvent public void F EventHandler h
  • 如何正确实现带有 close 方法的处置模式(CA1063)

    框架设计指南 第二版 第 327 页 说 考虑提供方法Close 除了Dispose 如果接近 是该领域的标准术语 这样做时 重要的是使 Close 实现与Dispose并考虑实施IDisposable Dispose方法明确 因此 按照提
  • 如何有效地左填充字节数组

    假设我有一个数组 LogoDataBy byte 0x00000008 0x00000000 0x41 0x00000001 0x42 0x00000002 0x43 0x00000003 0x44 0x00000004 0x31 0x00
  • 起订量工作单元

    我是单元测试的新手 我想为我的搜索功能创建一个测试 我的服务层看起来像 public class EmployeeService BaseService IEmployeeService public EmployeeService IUn
  • 获取不带波形符的泛型类名称[重复]

    这个问题在这里已经有答案了 我正在尝试获取类型名称T使用这个 typeof T Name 班级名称是ConfigSettings 而不是返回ConfigSettings它正在返回ConfigSettings 1 有什么具体原因吗 我怎样才能
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • “已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”

    我正在开发需要连接到另一个数据库以获取一些数据的应用程序 为此 我决定使用 SqlConnection reader 等 我需要执行一些查询 例如首先我需要获取某个用户的卡 ID 之后我需要通过该卡 ID 获取一些数据 这是我的代码 reg
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 扩展一个类

    编辑回答 虽然我最初的问题并没有完全按照康拉德 鲁道夫提供的答案所解决的方式解释我的需求 但他 无意或有意 基本上为我写了我想写的内容 类本身不会被扩展 但通过使类了解新函数来扩展其功能 这些新函数允许它 类 处理更广泛的问题 我非常感谢您
  • OpenMP 和 C++:this 指针

    Is thisOpenMP 中始终共享指针 尽管编译器不会抱怨以下代码default none pragma omp parallel for default none shared n for SInt i 0 i lt n i f i
  • 当一种语言是另一种语言的平行超集时,这意味着什么?

    我正在阅读关于实时并发 C 的期刊文章 http link springer com article 10 1007 2FBF00365999 并且它在摘要中提到 因此你们中的任何人都可以通过该链接查看上下文 Concurrent C 是
  • 为什么 g++ 在编译的二进制文件中存储类名?

    我注意到如果我跑strings在我编译的程序上g 输出包含它使用的各种类的名称 该程序是用 O3并且没有 g or p 并且当我剥离二进制文件时 类名仍然存在 我想知道为什么有必要g 将此信息存储在二进制文件中 出现的类名似乎都是使用虚函数
  • AllowUserToAddRows 不适用于 DataGridView 上的 List<> 数据源

    我有一个DataGridView与DataSource set to List
  • 错误:C# 尝试读取或写入受保护的内存

    我很难纠正这个错误 该应用程序在 4 台不同的机器上进行了测试 在其中 3 台上运行良好 但一台 Vista PC 在尝试通过 WebBrowser1 打开页面时出现此错误 解决这个问题的任何帮助对我都会非常有帮助 System Acces
  • 创建进程的多个子进程并维护所有 PID 的共享数组

    我已经分叉了几次 并用 C 创建了一堆子进程 我想将它们所有的 PID 存储在一个共享数组中 PID 的顺序并不重要 例如 我创建了 32 个进程 我想要一个 32 个整数长的数组来存储每个 PID 并且每个进程都可以访问 最好的方法是什么

随机推荐

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

    我在 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