C++ 用于'的初始值设定项太多;int[0]';c++;

C++ 用于'的初始值设定项太多;int[0]';c++;,c++,arrays,c++11,struct,initialization,C++,Arrays,C++11,Struct,Initialization,第一: 第二: int k[] ={1,2,3,4,5}; 对于这两个语句,为什么第一个语句通过了编译,而第二个语句给了我答案 错误:“int[0]”的初始值设定项太多。如果我设置k[5],编译将通过 此错误消息意味着什么?注意:在GNU GCC版本4.7.2上测试的代码可能会导致在结构中编译器需要您明确指定大小 (双关语)在C++11中,允许类内成员初始值设定项,但基本上与在成员初始化列表中初始化相同。因此,必须明确说明数组的大小 斯特劳斯特鲁普在他的网站上有一个简短的解释 错误消息表示您为

第一:

第二:

int k[] ={1,2,3,4,5};
对于这两个语句,为什么第一个语句通过了编译,而第二个语句给了我答案

错误:“int[0]”的初始值设定项太多。如果我设置k[5],编译将通过


此错误消息意味着什么?注意:在GNU GCC版本4.7.2上测试的代码可能会导致在结构中编译器需要您明确指定大小


(双关语)

在C++11中,允许类内成员初始值设定项,但基本上与在成员初始化列表中初始化相同。因此,必须明确说明数组的大小

斯特劳斯特鲁普在他的网站上有一个简短的解释


错误消息表示您为长度为0的数组提供了太多的项,这是
int[]
在该上下文中计算的结果。

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

第一个是变量声明(带有initialiser子句)


第二个是类型定义。

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

成员的内联初始化是一个完全不同的游戏。为了与您的第一个示例直接等效,您应该在成员初始化列表中初始化成员(尽管在有限的情况下,您可以像在第二个示例中那样进行内联操作)但我无法解释原因。@ValarDohaeris,这更像是一个“它必须有一个大小才能在类中这样做”的事情。IIRC,标准有明确的规定,我觉得很愚蠢。相同的构造和it编译器可以在一种情况下推断大小,但在另一种情况下不能。这有多不一致?
struct slk
{
    int k[] ={1,2,3,4,5};
};