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

Aggregate initialization of non-POD class types?

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

例如,如果我们有一个只有一个方法的结构:

struct T
{
   operator double();

   int a;

   int b;
} ;

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

T tObj { 56, 92 };

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

在 Clang 3.7 下编译正常,但在 VC++ 15 CTP 3 下编译不正常。

请问对这个问题有什么见解和引用标准吗?

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

[dcl.init.aggr] An aggregate is an array or a class with no user-provided constructors, no brace-or-equal-initializers for non-static data members, no private or protected non-static data members, no base classes, and no virtual functions

并且您的 class 符合该描述。

C++14放宽了对聚合的限制,去掉了"no brace-or-equal-initializers for non-static data members";这不影响这个问题。

请注意,您的 class 也是 POD;仅仅拥有一个成员函数并不会取消它的资格。但是否为POD与是否为聚合在很大程度上无关。