聚合非POD类类型的初始化?

时间:2015-03-04 16:19:09

标签: c++ initialization iso

在ISO C ++中聚合初始化非POD类类型是否合法?

例如,如果我们有一个像这样的单一方法的结构:

struct T
{
   operator double();

   int a;

   int b;
} ;

我们初始化它的一个实例:

T tObj { 56, 92 };

使用聚合初始化。这合法吗?

在Clang 3.7中它编译得很好,尽管在VC ++ 15 CTP 3中没有。

有关问题的任何见解和标准的引用吗?

1 个答案:

答案 0 :(得分:2)

您可以聚合初始化任何聚合,无论它是否为POD。 C ++ 11因此定义了一个聚合:

  

[dcl.init.aggr] 聚合是一个数组或类,没有用户提供的构造函数,没有用于非静态数据成员的大括号或等号初始值,没有私有或者受保护的非静态数据成员,没有基类,也没有虚函数

并且您的班级符合该说明。

C ++ 14放宽了对聚合的限制,删除了#34;非静态数据成员没有支持或等于初始化者&#34 ;;这不会影响这个问题。

请注意,您的课程也是POD;简单地拥有会员功能并不会使其失去资格。但是POD在很大程度上与它是否是一个聚合无关。