C++解释任务中的卷曲括号?

C++解释任务中的卷曲括号?,c++,C++,我刚刚尝试使用这段代码,但不知怎么的,我的编译器并没有将它标记为错误 struct structA{ int x; int y; }; ... struct structA var; var={1,2}; 不知怎么的,这很有效。 据我所知,{,}子句只允许作为聚合初始化。在这里我应该如何解释它?在这种情况下,允许使用这种形式的初始化 聚合是具有 没有用户提供、显式或继承的构造函数[class.ctor], 无私有或受保护的非静态数据成员子句[class.access], 没有虚

我刚刚尝试使用这段代码,但不知怎么的,我的编译器并没有将它标记为错误

struct structA{
    int x;
    int y;
};
...
struct structA var;
var={1,2};
不知怎么的,这很有效。 据我所知,{,}子句只允许作为聚合初始化。在这里我应该如何解释它?

在这种情况下,允许使用这种形式的初始化

聚合是具有

没有用户提供、显式或继承的构造函数[class.ctor], 无私有或受保护的非静态数据成员子句[class.access], 没有虚拟函数,也没有虚拟、私有或受保护的基类[class.mi]。 因此,这是允许的:

struct structA var = {1,2};
但实际上,C++11也允许这样做,因为您将初始值设定项列表用作rhs

如果右操作数是大括号的初始化列表

如果表达式E1具有类类型,则语法E1={args…}使用括号内的init列表生成对赋值运算符的调用 作为参数,然后选择适当的赋值 操作员遵循过载解决规则。 此类初始化仅允许用于聚合,包括POD 班级

structA是一个普通的旧数据。因此,它不会产生错误

如果将结构更改为:

struct structA{
    int x;
    int y;
    structA(int, int){} //user-defined constructor
 };
它会产生错误。有关更多信息,请参见此