int k[] ={1,2,3,4,5};
二:
struct slk
{
int k[] ={1,2,3,4,5};
};
爲這兩個語句,爲什麼第一個通過編譯,但第二個給定me
error:too many initializers for 'int [0]'. the compilation would passed if I set k[5];
這個錯誤信息是什麼意思?注意:在GNU GCC版本4.7.2上測試的代碼
int k[] ={1,2,3,4,5};
二:
struct slk
{
int k[] ={1,2,3,4,5};
};
爲這兩個語句,爲什麼第一個通過編譯,但第二個給定me
error:too many initializers for 'int [0]'. the compilation would passed if I set k[5];
這個錯誤信息是什麼意思?注意:在GNU GCC版本4.7.2上測試的代碼
在C++ 11,在級成員初始化是允許的,但基本上作用在相同的成員初始化列表初始化。因此,數組的大小必須明確說明。
Stroustrup在他的網站here上有一個簡短的解釋。
錯誤消息表示您爲長度爲0的數組提供太多項目,這是int []
在該上下文中計算的結果。
可能導致struct
編譯器需要您明確指定大小。
這是兩個完全不同的上下文:
首先是一個變量聲明(用初始化劑子句)。
第二個是類型定義。
在第一個示例中,實際發生的事情(實際的內存分配)。計算機很容易計算給予它的物品數量並將其用作容量。在第二次使用中,作爲結構的一部分,該數組只是結構模板的一部分。在第二種情況下,必須在編譯時明確給出大小並且知道大小。這裏沒有自動計數。它與函數聲明與定義以及變量聲明(告訴類型但內存未觸及)以及它們的調用/使用(程序的作用)類似。
我發現它很愚蠢。相同的結構和它的編譯器可以在一種情況下推導出尺寸,但在另一種情況下不能。這有多不協調? –
成員的內聯初始化是一個完全不同的球賽。爲了直接取得你的第一個樣本,你應該在_member初始化列表中初始化成員_(儘管在第二個樣本中你可以像在第二個樣本中那樣內聯地進行內聯)。 –
它似乎與'int k [5] = {1,2,3,4,5};'但我無法解釋爲什麼。 – ValarDohaeris
@ValarDohaeris,它更像是一個「它必須有一個尺寸才能做到這一點」的東西。 IIRC,該標準有明確的規定。 – chris