16

我在 VC++ 2010 中编写了这个程序:

class class1
{
public:
 class1 (initializer_list<int> a){};
 int foo;
 float Bar;
};
void main()
{
 class1 c = {2,3};
 getchar();
}

但是当我编译项目时出现此错误:

错误 1 ​​错误 C2552: 'c' : non-aggregates cannot be initialized with initializer list c:\users\pswin\documents\visual studio 2010\projects\test_c++0x\test_c++0x\main.cpp 27

2 IntelliSense:“class1”类型的对象不允许使用“{...}”进行初始化 c:\users\pswin\documents\visual studio 2010\projects\test_c++0x\test_c++0x\main.cpp 27

问题是什么?

4

1 回答 1

36

根本不应该支持它:

[...] 初始化列表的 C++0x 核心语言特性和相关的标准库更改未在 VC10 中实现。

错误消息是指聚合初始化的 pre-C++0x 特性,它允许使用花括号来初始化某些用户定义的类型:

struct pair { int first; char second; };
pair p = { 0, 'c' };

聚合在§8.5.1中定义:

聚合是一个数组或类(第 9 条),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数(10.3) )。

当一个聚合被初始化时,初始化器可以包含一个初始化器子句,该子句由一个用大括号括起来、逗号分隔的初始化器子句列表组成,用于聚合的成员,以递增的下标或成员顺序编写。如果聚合包含子聚合,则此规则递归地应用于子聚合的成员。

于 2010-05-07T22:40:16.913 回答