首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告: new中的非常数组大小,无法验证初始化器列表的长度

警告: new中的非常数组大小,无法验证初始化器列表的长度
EN

Stack Overflow用户
提问于 2013-02-06 00:58:14
回答 2查看 1.2K关注 0票数 2

我面临着一个与此类似的问题。

代码语言:javascript
复制
int j = 6;
int *k = new int[j]{4};

警告是:

代码语言:javascript
复制
warning: non-constant array size in new, unable to verify length 
of initializer-list [enabled by default]

我只看到一个警告,没有错误,并且我使用-std=gnu++11运行

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-06 01:10:19

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

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

代码语言:javascript
复制
std::vector<int> v(j, 4);
// `v` contains `j` ints, all initialised to `4`

如果您具有不能默认构建的元素类型,则可以在位构建元素:

代码语言:javascript
复制
std::vector<T> v;
v.reserve(j);
for (size_t i = 0; i < j; i++)
   v.emplace_back(ctor-args-here);

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

代码语言:javascript
复制
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)
};

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

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

(不幸的是,我不知道如何在没有循环或代码重复的情况下做到这一点。)

票数 5
EN

Stack Overflow用户

发布于 2013-02-06 01:23:27

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

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

-如果初始化器是(无括号的)带括号的init列表,则对象或引用是列表初始化的(8.5.4)。

-如果初始化器是(),则对象是值初始化的。

-否则,如果目标类型是数组,则程序的格式不正确。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14712802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档