C++11 为什么统一初始化在没有显式构造函数的情况下工作 #包括 使用名称空间std; 结构点 { int x; int-y; }; int main() { //点p(2,3);//错误:“点”的初始化没有匹配的构造函数 点p{2,3};//很好 }

C++11 为什么统一初始化在没有显式构造函数的情况下工作 #包括 使用名称空间std; 结构点 { int x; int-y; }; int main() { //点p(2,3);//错误:“点”的初始化没有匹配的构造函数 点p{2,3};//很好 },c++11,C++11,问题>如果我们使用统一初始化来初始化变量,那么我们不必定义相应的显式构造函数,这是真的吗?如上面的示例所示,类Point没有具有两个传入参数的构造函数,但统一初始化仍然有效。我在这里感到困惑,想知道我问题的答案 谢谢统一初始化的目的是作为初始化任何可初始化对象的单一方法。因此,它可以选择适当的初始化机制,以便在内部为特定类型使用 点是一个。因此,在C++98/03中,它可以通过聚合初始化进行初始化,就像数组一样 #include <iostream> using namespace

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


谢谢

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

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

#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
}
这在C++98/03中是合法的

在C++11中,聚合初始化是统一初始化变量的可能方式之一。如果要初始化的类型是聚合,则使用带括号的init列表的成员通过聚合初始化对其进行初始化。但是C++98/03中的聚合初始化只在
Typename var=bracked init list中工作表单。统一初始化允许所有这些表单也使用它:

Point p = {3, 4};

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

显式构造函数
并不是您认为的意思。你的意思是,没有用户定义的构造函数。您的类型是一个聚合,甚至C(和C++89、C++03)都可以使用大括号初始化这些类型-initialization@sehe当前位置我不同意这是重复的。答案可能是相同的(或相似的,因为它只是关于聚合而不是POD),但问题是非常不同的。然而,对我来说,“
显式
构造函数”是指用“explicit”关键字声明的构造函数或类似的东西(例如,隐式声明的继承构造函数,具有这样的“
显式
”含义)。@sehe我也不同意。这些问题是不同的,答案也应该是不同的(据我所知,答案是不同的)。当然,问题是不同的。从来没有人问过确切的副本。在我看来,OP是在寻找相关信息,缺乏专业术语。我指着它,不明白为什么反复添加这个问题会增加价值,只是因为它不是完全相同的问题。
Point p{3, 4};

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

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