错误:const的初始化程序太多

时间:2015-01-24 08:53:26

标签: c++ c++11

为什么会出现以下错误

$ g++ -std=c++11 aaa.cpp 
  

aaa.cpp:15:2:错误:'const aaaa :: Fruit_List [0]'的初始化程序太多

     

};

     

^

编译以下代码时:

class aaaa
{  // without wrapping in class the code compiles fine
    const int a=7; // compiles fine

    struct Fruit_List{
        int index;
        int length;
    } const fruit_list[]={ // error: if I put 5 in braket the code compiles fine
        {0,3},
        {1,2},
        {2,5},
        {3,1},
        {4,7}
    };
};

int main()
{
    return 0;
}

如果我在没有包装的情况下编写代码,它就可以正常编译。给出数组的长度将抑制编译器错误。但是坚持将代码放在类中并避免给出数组大小,因为我可能稍后添加任何成员,并且我希望将数组长度确定留给编译器。

强烈地,请避免链接到任何不适当的问题。

更新

感谢juanchopanza的评论。现在我知道即使这个更简单的代码也无法编译:

class aaaa
{
    const int a[]={7,4,5};
};

int main()
{
    return 0;
}

1 个答案:

答案 0 :(得分:0)

正如您可能理解的那样,通过将其包装到类中,您假设的常量不再是名称,这些名称引用具有在初始化常量时给定的固定值的对象 。相反,您现在声明了常量数据成员,它们类似于非常量数据成员,并且自己存在于该类中的每个实例中。您提供的值只不过是默认值,用于在构造函数中初始化常量成员。

考虑这个例子:

#include <ostream>
#include <iostream>

struct Demo {
  const int args[3];
  Demo() : args{1,2,3} {}
  Demo(int x) : args{x,x,x} {}
  Demo(int y, int z) : args{y, z} {}
};

int main(void)
{
  Demo d1;
  Demo d2(1,2);
  std::cout << d2.args[0] << ' ' << d2.args[1] << ' '
            << d2.args[2] << '\n';  // outputs "1 2 0"
  return 0;
}

并非所有构造函数都使用相同数量的值初始化Demo::args。这是有效的,其余元素是零填充的。您在类中为非静态数据成员提供的初始化只是在每个构造函数中使用该值的语法糖,其中在init列表中未指定该成员的显式值,因此上面的示例也可以这样写:< / p>

#include <ostream>
#include <iostream>

struct Demo {
  const int args[3] = {1,2,3};
  Demo() {}
  Demo(int x) : args{x,x,x} {}
  Demo(int y, int z) : args{y, z} {}
};

int main(void)
{
  Demo d1;
  Demo d2(1,2);
  std::cout << d2.args[0] << ' ' << d2.args[1] << ' '
            << d2.args[2] << '\n';  // outputs "1 2 0"
  return 0;
}

成员Demo::args的初始值设定项不是 初始值设定项,而只是一个初始化程序,而构造函数可以指定不同的初始化程序。这很可能是为什么不允许大小减少的原因,就像你不能在非静态数据成员上使用auto一样。

如果您只想在程序运行到类提供的命名空间时始终将单个命名实体的名称设为常量值,但不希望能够在某些类中指定不同的值构造函数,在类中使用static常量。