1
#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 p{2, 3}; // fine
}

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

谢谢

4

1 回答 1

3

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

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

Point p = {3, 4};

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

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

Point p{3, 4};

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

Point Func2()
{
  return {3, 4};
}

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

于 2013-07-29T19:20:27.540 回答