我刚刚尝试使用此代码,但以某种方式发现我的编译器未将其标记为错误。
struct structA{
int x;
int y;
};
...
struct structA var;
var={1,2};
这有点奏效。 据我所知,{,}子句仅允许作为聚合初始化。我在这里应该怎么解释?
答案 0 :(得分:4)
在这种情况下为structA
is an aggregate,因此允许这种形式的初始化。
聚集是具有
或
的类的数组
- 没有用户提供的,显式的或继承的构造函数([class.ctor]),
- 没有私有或受保护的非静态数据成员(条款[class.access]),
- 没有虚拟功能,也没有虚拟,私有或受保护的基类([class.mi])。
因此将被允许
struct structA var = {1,2};
但是实际上您拥有的是assignment,这也是允许的(从C ++ 11开始),因为您使用的是初始化列表作为rhs。
如果正确的操作数是一个括号初始化列表
- 如果表达式E1具有类类型,则语法E1 = {args ...} 使用braced-init-list生成对赋值运算符的调用 作为参数,然后选择适当的分配 运算符遵循重载解析规则。
答案 1 :(得分:0)
这种初始化仅适用于包含POD的聚合 课。
structA是POD(普通旧数据)。因此不会产生错误。
如果将structA更改为:
struct structA{
int x;
int y;
structA(int, int){} //user-defined constructor
};
它将产生错误。有关更多信息,请参见此What is assignment via curly braces called? and can it be controlled?