2

我面临与此类似的问题。

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 运行

另外,我希望为每个实例调用构造函数。如果我打印数组值,所有

4

2 回答 2

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)
};

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

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

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

于 2013-02-05T17:10:18.780 回答
2

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

初始化器的语义如下。目标类型是正在初始化的对象或引用的类型,源类型是初始化表达式的类型。如果初始化器不是单个(可能是带括号的)表达式,则未定义源类型。

— 如果初始值设定项是(无括号的)大括号初始化列表,则对象或引用是列表初始化的(8.5.4)。

— 如果初始值设定项是 (),则对象是值初始化的。

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

于 2013-02-05T17:23:26.683 回答