当前位置: 首页 > 知识库问答 >
问题:

来自同一类型对象的列表初始化优先级

水焱
2023-03-14
#include <iostream>
#include <initializer_list>
using namespace std;

struct CL
{
    CL(){}
    CL (std::initializer_list<CL>){cout<<1;}
    CL (const CL&){cout<<2;}
};

int main()
{
    CL cl1;
    CL cl2 {cl1}; //prints 21
}

下面是带有复制构造函数和初始化列表构造函数的CL结构。我认为这里只能调用复制构造函数,因为根据C++14标准,8.5.4/3

    null

谁是对的?谁的行为是正确的?

共有1个答案

许彦
2023-03-14

TL;DR:发布的C++14文本指定输出21。然而,该代码的行为被CWG问题1467改变,该问题于2014年11月获得缺陷状态。

缺陷报告被认为具有追溯效力。CLANG3.7和VS2015已经应用了本缺陷报告建议的解决方案,该缺陷报告出现在N4296的C++17草案中。

在此缺陷报告之前,N4140[over.match.list]中的这篇文章涵盖了该行为:

    null

如果初始值设定项列表没有元素,并且T有默认构造函数,则省略第一阶段。在复制列表初始化中,如果选择显式构造函数,则初始化格式不正确。[注意:这与其他情况(13.3.1.3、13.3.1.4)不同,在其他情况下,复制初始化只考虑转换构造函数。只有当初始化是重载解析最终结果的一部分时,此限制才适用。-结束注意]

您的类不是聚合,因为它有用户提供的构造函数。

以上文本由[dcl.init.list]/3中的以下项目符号指向:

    null

这段文字不是在C++14中,而是在以后的一个缺陷报告中应用的。在应用了缺陷报告的更新标准(N4296)中,这在[dcl.init.list]/3中的项目符号列表中显示为更高的项目符号;所以现在复制构造函数在这个过程中被选中了,我们没有达到上面[over.match.list]的步骤。

请注意,尽管该缺陷名为List-initialization of aggregate from son-type object,但该解决方案实际上会影响聚合和非聚合的初始化。

 类似资料:
  • 初始化动画类型的对象时,会收到以下警告。 (警告添加为注释) 这是一张照片 以下是代码摘要: 这是我尝试编译后的日志猫 这里是我使用错误代码的地方 列表视图1。setOnItemClickListener(新的AdapterView.OnItemClickListener(){ 我找不到错误。 我创建了正确的文件夹和文件。在这里。 这是我得到我正在使用的动画代码的地方。 试图创建一个文件夹。收到这

  • 问题内容: 这个问题不是关于为什么我们将列表初始化为实现的接口,例如 问题是以下两个之间有何区别?为什么它们(显然)以相同的方式工作? 问题答案: 这两段代码是等效的,并使用 类型 创建s (在您的示例中): 但是,第二个示例使用Java 7中引入的 菱形运算符 ()。它添加了类型推断,并减少了赋值的冗长性。 请参阅文档中的以下引用: 您可以用一组空的类型参数()来替换调用通用类的构造函数所需的类

  • 问题内容: 我在用Java工作。 我通常会这样设置一些对象: 问题是:在此示例中是否等于,按原样我可以假定对未初始化的对象进行空检查将是准确的? 问题答案: 正确,未显式初始化的引用类型的静态成员和实例成员都由Java 设置为。相同的规则适用于数组成员。 根据Java语言规范的第4.12.5节: 变量的初始值 程序中的每个变量在使用值之前都必须具有一个值: 每个类变量,实例变量或数组组件在创建时均

  • 嘿,我是Java新手,在数组方面一直有困难。我正在尝试使用数组或数组列表来存储我的测试类中的值列表。但是我正在讨论如何将set1和set2添加到我的数组列表中。 我有一个测试班 然后我的数据类

  • 问题内容: 我在Google Go中编写数据库接口。它需要保存对象并将其保存为[] byte切片,并将数据加载到其中以返回它: 我想实现能够一次性加载s 的任意长度切片的功能(例如“从存储桶X加载所有数据”)。我希望函数能够加载任何数量的数据对象,而无需事先知道要加载多少个对象,因此我不希望最终用户将要填充的数据片传递给我。取而代之的是,我带一个样本对象来了解我正在处理的结构: 我在编写此代码时遇

  • 考虑如下代码: vector<double> v = { 1, 2, 3.456, 99.99 }; list<pair<string,string>> languages = { {"Nygaard","Simula"}, {"Richards","BCPL"}, {"Ritchie","C"} }; map<vector<string>,vector<int>> years = {