我面临着一个与此类似的问题。
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运行
另外,我希望为每个实例调用构造函数。如果我打印数组值,则所有
发布于 2013-02-06 01:10:19
问题就是编译器告诉你的。
只有在运行时才知道维度,因此您只能使用运行时功能,例如:
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-06 01:23:27
据我所知,C++11标准的第8.5/16节基本上消除了调用用户定义的构造函数来统一初始化类类型数组的所有元素的可能性。以下是相关文本(我删掉了几个看起来不相关的列表项目):
初始化器的语义如下所示。目标类型是被初始化的对象或引用的类型,源类型是初始化器表达式的类型。如果初始值设定项不是单个(可能是带括号的)表达式,则未定义源类型。
-如果初始化器是(无括号的)带括号的init列表,则对象或引用是列表初始化的(8.5.4)。
-如果初始化器是(),则对象是值初始化的。
-否则,如果目标类型是数组,则程序的格式不正确。
https://stackoverflow.com/questions/14712802
复制相似问题