C ++解释赋值中的大括号?

时间:2019-01-09 04:39:51

标签: c++

我刚刚尝试使用此代码,但以某种方式发现我的编译器未将其标记为错误。

struct structA{
    int x;
    int y;
};
...
struct structA var;
var={1,2};

这有点奏效。 据我所知,{,}子句仅允许作为聚合初始化。我在这里应该怎么解释?

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?