【问题标题】: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 p{2, 3}; // fine
}

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

谢谢

【问题讨论】:

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

标签: c++11


【解决方案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 p{3, 4};

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2013-02-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多