为什么统一初始化无需显式构造函数

时间:2013-07-29 18:52:25

标签: c++11

#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
}

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

谢谢

1 个答案:

答案 0 :(得分:3)

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

Pointaggregate。因此,在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构造函数),你的所有代码都可以正常工作。