web-dev-qa-db-ja.com

'int [0]' c ++の初期化子が多すぎます

最初:

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

第二:

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

これらの2つのステートメントについて、最初のステートメントはコンパイルに合格するのに、2番目のステートメントはなぜ

エラー: 'int [0]'の初期化子が多すぎます。 k [5]を設定するとコンパイルは成功します。

このエラーメッセージの意味は何ですか?注:GNU GCCバージョン4.7.2でテストされたコード

24
cppython

C++ 11では、クラス内のメンバー初期化子が許可されていますが、基本的にはメンバー初期化リストでの初期化と同じように動作します。したがって、配列のサイズを明示的に指定する必要があります。

Stroustrupは彼のウェブサイトで簡単な説明をしています here

エラーメッセージは、長さ0の配列に対して提供するアイテムが多すぎることを意味します。これはint []は、そのコンテキストで評価されます。

30
jtomschroeder

最初の例では、実際に何か(実際のメモリ割り当て)が発生しています。コンピューターは、与えられたアイテムの数を簡単にカウントし、これを容量として使用します。 2番目の使用法では、構造体の一部として、配列は単に構造体のテンプレートの一部です。 2番目の場合、サイズはコンパイル時に明示的に指定され、既知である必要があります。ここには自動カウントはありません。関数宣言と定義、変数宣言(tells型ですがメモリは変更されません)およびそれらの呼び出し/使用(プログラムが動作する場所)と同様の流れです。

3
Chris Zhang

おそらくstructでコンパイラーはサイズを明示的に指定する必要があります。

C構造内の配列を初期化する (意図したしゃれ)

2
Dannie

これらは、まったく異なる2つのコンテキストです。

1つは変数宣言です(初期化句を使用)。

2番目は型定義です。

1
user3200739