【问题标题】:c++11 value-initialization prior to aggregate-initialization聚合初始化之前的 c++11 值初始化
【发布时间】:2016-09-20 07:49:23
【问题描述】:

我试图理解@bolov 对问题Deleted default constructor. Objects can still be created... sometimes [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 的构造函数会分两个阶段考虑:

    • 所有采用 std::initializer_list 的构造函数...

    • 否则 [...] T 的所有构造函数都参与重载决议 [...] 这会处理 C(和 C++11 中的 F) ...

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

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

  • 如果初始化列表没有元素,并且 T 是具有默认构造函数的类类型,则对象是值初始化的。
  • 否则,如果 T 是聚合,则执行聚合初始化 (8.5.1)

所以foo f { };scenario A应该导致值初始化,即调用DELETED默认构造函数,代码应该失败编译。

【问题讨论】:

  • 我不知道你在问什么。
  • 试图让它更简洁。
  • @Quentin,好吧,我会努力写的更好。
  • @Quentin,我已经重写了我的问题。
  • 非常好,改进了很多!我在不同的初始化中有点迷失,但cppreference page for value initialisation 在任何描述之前声明,“在所有情况下,如果使用空括号{} 并且 T 是聚合类型,聚合初始化是执行而不是值初始化。”。

标签: c++ c++11 aggregate language-lawyer value-initialization


【解决方案1】:

由于Core Issue 1301(这是针对 C++11 的缺陷),列表初始化的优先级从:

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

  • 如果初始化列表没有元素,并且 T 是具有默认构造函数的类类型,则对象是值初始化的。
  • 否则,如果 T 是聚合,则执行聚合初始化 (8.5.1)

到:

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

  • 如果 T 是聚合,则执行聚合初始化 (8.5.1)
  • 否则,如果初始化列表没有元素并且 T 是具有默认构造函数的类类型,则对象是值初始化的。

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

【讨论】:

  • 是的,我了解,但此更改在 #3367 草案中,并且已被 C++14 接受。但在 Wiki 中,我读到草案 #3337 最接近 c++11。所以在 c++11 中我们没有改变,所以编译器在编译为 c++11 时不应该将场景 A 视为聚合初始化,对吗?
  • @JenyaKh 问题 1301 是针对 C++11 的缺陷,因此符合 C++11 的编译器应该实现更改。
  • @JenyaKh 缺陷报告向后应用到相应的标准。它们是补丁更新,如果你愿意的话:)
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2017-07-01
  • 2020-03-18
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多