警告:新的非常量数组大小,无法验证初始化列表的长度

时间:2013-02-05 16:58:14

标签: c++ gcc-warning

我遇到了与此类似的问题。

int j = 6;
int *k = new int[j]{4};

警告是:

warning: non-constant array size in new, unable to verify length 
of initializer-list [enabled by default]

我只面对警告,没有错误,我使用-std = gnu ++ 11

运行

另外,我想要为每个实例调用构造函数。如果我打印数组值,全部

2 个答案:

答案 0 :(得分:5)

问题正是编译器告诉你的。

维度仅在运行时才知道,因此您只能使用运行时功能,例如:

std::vector<int> v(j, 4);
// `v` contains `j` ints, all initialised to `4`

如果你有一个不能默认构造的元素类型,你可以就地构建元素:

std::vector<T> v;
v.reserve(j);
for (size_t i = 0; i < j; i++)
   v.emplace_back(ctor-args-here);

您可能还可以使用初始化列表:

std::vector<T> v{
   T(ctor-args-here), T(ctor-args-here), T(ctor-args-here),
   T(ctor-args-here), T(ctor-args-here), T(ctor-args-here)
};

将移动对象,或者最坏的情况是复制对象。

这里的要点是,向量元素不需要需要是默认构造的。

(不幸的是,我没有意识到没有循环或代码重复的方法。)

答案 1 :(得分:2)

据我所知,C ++ 11标准的第8.5 / 16节几乎消除了调用用户定义的构造函数来统一初始化类类数组的所有元素的可能性。这是相关文本(我已经删除了几个似乎不相关的列出的项目):

  

初始化器的语义如下。目的地类型是   正在初始化的对象或引用的类型以及源   type是初始化表达式的类型。如果初始化程序是   不是单个(可能带括号的)表达式,源类型是   没有定义的。

     

- 如果初始化程序是(非括号内)   braced-init-list,对象或引用是列表初始化的(8.5.4)。

     

- 如果初始值设定项为(),则对象进行值初始化。

     

- 否则,如果目标类型是数组,则程序格式错误。