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

C 11聚合初始化之前的值初始化

于正志
2023-03-14

我试图理解@bolov对删除默认构造函数问题的第一个公认答案。对象仍然可以创建......有时[1]

似乎我发现了一个错误,所以它搞乱了整个解释。

@bolov解释了为什么这段代码能够在c 11中成功编译:

场景A

struct foo {
  foo() = delete;
};

// All bellow OK (no errors, no warnings)
foo f = foo{};
foo f = {};
foo f{}; // will use only this from now on.

以及为什么这段代码无法在c 11中编译:

场景C

struct foo {
  foo() = delete;
  foo(int) {};
};

foo f{}; // error call to deleted constructor

他说,重点是第一个foo是聚合,第二个foo不是聚合。

然后他给出了cppreference的摘录:

T类型对象的列表初始化的影响是:。。。

>

  • 如果T是聚合类型,则执行聚合初始化。这考虑了场景A B D E(和C 14中的F)
  • 否则,T的构造函数将分两个阶段考虑:

    >

    否则[…]T的所有构造函数都参与重载解析[…]这涉及到C(和C 11中的F)。。。

    根据你写foo f{}时的摘录;在场景A中,您将获得聚合初始化。A那太好了。但实际上,在c 11(#3337草稿,最接近标准)中,您有不同的初始化顺序:

    类型T的对象或引用的列表初始化定义如下:

    • 如果初始值设定项列表没有元素,并且T是具有默认构造函数的类类型,则该对象是值初始化的

    So foo f{};在场景A中,应导致值初始化,即,将调用删除的默认构造函数,并且代码应无法编译。

  • 共有1个答案

    高功
    2023-03-14

    由于核心问题1301是C 11的一个缺陷,列表初始化的优先级从:

    类型T的对象或引用的列表初始化定义如下:

    • 如果初始值设定项列表没有元素,并且T是具有默认构造函数的类类型,则该对象是值初始化的

    到:

    类型T的对象或引用的列表初始化定义如下:

    • 如果T是聚合,则执行聚合初始化(8.5.1)

    所以场景A中的foo{}仍然是聚合初始化。

     类似资料:
    • 我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。 以下是JLS§12.4.2(Java SE 8),清单6-7: 我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?

    • 考虑以下代码 VS2013编译器发出以下警告: 警告C4351:新行为:数组“B::member”的元素将默认初始化1 这里有记载 使用C 11,并应用“默认初始化”的概念,意味着B. part的元素将不会被初始化。 但我认为,成员{}应该执行值初始化,而不是默认初始化。VS2013编译器是否损坏? 8.5美元/6 默认初始化类型为T的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则

    • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

    • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的

    • new iSlider(DOM, DATA, OPTIONS) Name Type Description DOM dom 容器dom节点 DATA Array 数据列表 OPTIONS Object 配置项 DOM new iSlider(DOM, DATA, OPTIONS); {HTMLElement} 容器dom节点 作为第一个参数并不是必须的,会被OPTIONS.dom覆盖,但是这十分必