首页 > 解决方案 > C ++解释赋值中的大括号?

问题描述

我刚刚尝试使用此代码,但不知何故发现它没有被我的编译器标记为错误。

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

这不知何故运作良好。据我所知,{,} 子句只允许作为聚合初始化。我应该如何在这里解释它?

标签: c++

解决方案


在这种情况下structA是一个聚合,所以这种形式的初始化是允许的。

聚合是一个数组或一个

  • 没有用户提供的、显式的或继承的构造函数([class.ctor]),
  • 没有私有或受保护的非静态数据成员(子句 [class.access]),
  • 没有虚函数,也没有虚拟、私有或受保护的基类([class.mi])。

所以这将是允许的:

struct structA var = {1,2};

但是您实际拥有的是也允许的赋值(来自 C++11),因为您使用初始化列表作为 rhs。

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

  • 如果表达式 E1 具有类类型,则语法 E1 = {args...}生成对赋值运算符的调用,并以花括号初始化列表 作为参数,然后根据重载决策规则选择适当的赋值运算符。

推荐阅读