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

Vig*_*ren 2 c++ gcc-warning

我遇到了类似这个问题.

int j = 6;
int *k = new int[j]{4};
Run Code Online (Sandbox Code Playgroud)

警告是:

warning: non-constant array size in new, unable to verify length 
of initializer-list [enabled by default]
Run Code Online (Sandbox Code Playgroud)

我只面对一个警告,没有错误,我用-std = gnu ++ 11运行

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

Lig*_*ica 5

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

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

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

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

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

您也可以使用初始化列表:

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)
};
Run Code Online (Sandbox Code Playgroud)

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

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

(不幸的是,如果没有循环或代码重复,我不知道如何做到这一点.)