g ++警告声明多维,双数组

yan*_*ang 1 c++ g++ multidimensional-array

在我的C++程序中,我试图用全0来初始化一个3*3*3类型的double数组.在类头文件中,我声明了一个成员

double list[3][3][3];
Run Code Online (Sandbox Code Playgroud)

当我打印出这个数组的内容时,我发现并非所有条目都是0,正如我预期的那样.例如list [1] [1] [1]的值为4.03158e-321

因此,我手动将此数组初始化为构造函数中的所有0:

list = {{{0,0,0},{0,0,0},{0,0,0}},
      {{0,0,0},{0,0,0},{0,0,0}},
      {{0,0,0},{0,0,0},{0,0,0}}};
Run Code Online (Sandbox Code Playgroud)

这使我的程序工作,但是,我得到了编译器警告:

warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
Run Code Online (Sandbox Code Playgroud)

因此,我的问题是

  1. 为什么列表在标题中初始化后会有非零条目?
  2. 为什么我会收到上述警告信息,以及如何摆脱它?

我的编译器是g ++(Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2,gcc版本4.5.2(Ubuntu/Linaro 4.5.2-8ubuntu4)

Dav*_*eas 5

在C++ 03中,您只能在定义数组时使用该初始化:

double list[3][3][3] = {{{0,0,0},{0,0,0},{0,0,0}},
                        {{0,0,0},{0,0,0},{0,0,0}},
                        {{0,0,0},{0,0,0},{0,0,0}}};
Run Code Online (Sandbox Code Playgroud)

编译器警告说,根据当前标准,它不应该接受您的代码,即使它能够通过应用即将出现的标准规则来处理它,其中{...}称为外部初始化程序.

在这种特殊情况下,如果数组是成员,并且您想将其初始化为全零,则可以在C++ 0x中使用值初始化:

struct test { 
   double list[3][3][3];
   test() : list()
   {}
};
Run Code Online (Sandbox Code Playgroud)

对于POD类型的成员(其数组double是),list()初始化列表中的上面()语法意味着要对值进行初始化,这实际上意味着所有值都将设置为0