C++中“int [0]”有太多的初始化器

30

首先:

int k[] ={1,2,3,4,5};

其次:

struct slk
{
    int k[] ={1,2,3,4,5};
};

这两个语句为什么第一个可以通过编译但第二个会给我

error:too many initializers for 'int [0]'. 如果我设置k[5];则可以通过编译。

这个错误消息是什么意思?注意:代码测试于GNU GCC 4.7.2版本。


4
成员变量的内联初始化是一项完全不同的技术活。为了直接等价于你的第一个示例,你应该在成员初始化列表中初始化成员变量(尽管有限的情况下,你可以像在第二个示例中那样内联初始化)。 - Lightness Races in Orbit
它似乎可以运行 int k[5]={1,2,3,4,5};,但我无法解释为什么。 - ValarDohaeris
@ValarDohaeris,这更多是一个“类必须具有大小才能执行该操作”的问题。如果我没记错的话,标准有明确的规定。 - chris
4个回答

38

在C++11中,允许使用类内成员初始化器,但实际上与在成员初始化列表中初始化的行为基本相同。因此,必须明确声明数组的大小。

Stroustrup在他的网站这里有一个简短的解释。

该错误消息意味着你提供了太多的项目给长度为0的数组,这是在该上下文中int []求值得到的。


3
在第一个例子中,实际发生了某些事情(实际内存分配)。计算机轻松地计算出给定的项目数量,并将其用作容量。在第二个用法中,作为结构体的一部分,数组只是结构体模板的一部分。在第二种情况下,必须显式地给出一个大小并在编译时知道它。这里没有自动计数。这类似于函数声明与定义以及变量声明(告诉类型但不触及内存)和它们的调用/使用(程序执行的地方)的方式。

1
我觉得这很荒谬。相同的结构,编译器在一个情况下可以推断大小,但在另一个情况下却不能。这有多不一致啊? - There is nothing we can do
@Thereisnothingwecando 这是因为 struct 可以有构造函数,因此数组可以用另一种方式初始化,这可能导致推断出不兼容的类型。这在全局或函数作用域中声明和初始化的变量中不会发生。这与 问题有关。 - Ale

2

1

这是两个完全不同的上下文:

第一个是变量声明(带有初始化子句)。

第二个是类型定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接