为啥统一初始化没有显式构造函数[重复]

Posted

技术标签:

【中文标题】为啥统一初始化没有显式构造函数[重复]【英文标题】:Why uniform initialization works without explicit constructor [duplicate]为什么统一初始化没有显式构造函数[重复] 【发布时间】:2013-07-29 16:59:45 【问题描述】:
#include <iostream>
using namespace std;

struct Point

  int x;
  int y;
;

int main()

  //Point p(2, 3); // error: no matching constructor for initialization of 'Point'
  Point p2, 3; // fine

疑问> 如果我们使用统一初始化来初始化一个变量,是不是就不用定义对应的显式构造函数了?如上例所示,Point 类没有带有两个传入参数的构造函数,但统一初始化仍然有效。我在这里感到困惑,想知道我的问题的答案。

谢谢

【问题讨论】:

explicit constructor 并不像您认为的那样。你的意思是,没有用户定义的构造函数。您的类型是聚合类型,甚至 C(和 c++89、c++03)也可以使用 brace-initialization 来初始化它们 @sehe:我不同意这是重复的。 答案可能相同(或相似,因为它只是关于聚合而不是 POD),但问题却大不相同。 对我来说,“显式构造函数”是指用户编写的构造函数。但是,对我来说,“explicit 构造函数”意味着使用“显式”关键字或等效关键字声明的构造函数(例如,具有“explicit”含义的隐式声明的继承构造函数)。 @sehe 我也不同意。这些问题是不同的,答案可能也应该不同(据我所知,它们是不同的)。 好吧。当然问题是不同的。从未询问过 exact 重复项。在我看来,OP 正在寻找相关信息,并且缺乏行话。我指出了它,但不明白为什么再次添加 this specific 问题会增加价值,只是因为它不是完全相同的问题。 【参考方案1】:

统一初始化的目的是成为初始化任何可以初始化的对象的单一方法。因此,它可以挑选适当的初始化机制以在内部用于特定类型。

Point 是一个aggregate。因此在 C++98/03 中,它可以通过聚合初始化来初始化,就像数组一样。

Point p = 3, 4;

这在 C++98/03 中是合法的。

在 C++11 中,聚合初始化是统一初始化初始化变量的可能方式之一。如果被初始化的类型是一个聚合,那么braced-init-list 的成员被用来通过聚合初始化来初始化它。但 C++98/03 中的聚合初始化仅在 Typename var = braced-init-list; 形式下有效。统一初始化允许所有这些表单也使用它:

Point p3, 4;

void Func(const Point &p);
Func(3, 4);

Point Func2()

  return 3, 4;

所有这些都使用统一初始化来初始化Point 聚合。但是,由于它使用统一的初始化语法,您可以稍后更改 Point 以添加构造函数。只要您添加一个接受两个整数的构造函数(并且不要添加一个接受整数的initializer_list 构造函数),您的所有代码都可以正常工作。

【讨论】:

以上是关于为啥统一初始化没有显式构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

构造函数必须显式初始化没有默认构造函数的成员

为啥显式允许默认构造函数和具有 2 个或更多(非默认)参数的构造函数?

聚合初始化不支持构造函数访问[重复]

C++中派生类的构造函数怎么显式调用基类构造函数?

java基础

爪哇。隐式超级构造函数 Employee() 未定义。必须显式调用另一个构造函数[重复]