非 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与是否为聚合在很大程度上无关。
在 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与是否为聚合在很大程度上无关。