2016-11-07 2 views
4

関数の中で宣言された文字列の配列を取得できないようです。g ++コンパイラは文字列と整数の配列を別々に表示しますか?

void foo(string arr[], int arrSize) { 
    string temp[arrSize]; //Results in error shown below 
    int temp2[arrSize]; // Compiles fine 
} 

私が述べてコンパイル時にエラーになっています: ... [...非POD要素タイプ「文字列」(別名​​「のbasic_string、アロケータ>」)の可変長配列を

私は、定数としてvoid foo(string arr[], const int arrSize);を定数として宣言しようとしましたし、関数内で新しい定数の整数を宣言してarrSizeに初期化しても、どちらも同じエラーになります。私はこれをコンパイルすることができる唯一の方法は、私の一時的な文字列配列を宣言するときにマジックナンバーを使用することです。

また、代わりにベクターを使用することもできますが、この動作がなぜ発生しているのか不思議です。

ありがとうございました!

+3

どちらもそれらの標準C++「誰が実際にそれを実装するために周りに来ませんでした」。今はVLAをどのように実装しているかはコンパイラによって異なります。 – Nawaz

+0

そして、GCCがそれらを別々に扱う理由は、まだ興味深い質問です。 – HolyBlackCat

+0

C++の配列サイズは、 'const'だけでなくコンパイル時定数でなければなりません。 'int temp2 [arrSize];が動作するという事実は、コンパイラ拡張です。 – user2357112

答えて

5

はい、別の方法で処理します。エラーメッセージからわかるように、要素がPOD型の場合にのみ、g ++は可変長配列の作成を許可します。

なぜ技術的な理由があるのか​​わからないのですが、これはCから引き継がれた非標準的な拡張ですので、c互換の構造体のためにそれを実装するのは簡単でした(これは本質的にPODと同じです)、誰もこれを非PODタイプに拡張するのに気にかけませんでした。コメントへの応答で

は:std::stringは文字の配列だけではなく、ヒープ上のどこかにデータを割り当てることができるはるかに複雑なクラス、(ちょうどstd::vector<int>などがintの配列だけではありません) 。

更新:C++のためRuntime-sized arrays with automatic storage durationを提案紙から興味深いデータポイントは:

配列要素タイプなどのPODの機能を制限する理由、したがって、そのような制限が提案されていないがありません。

だから、本当にの場合のようだ:

+0

詳細な回答ありがとうございます。 – Setleaf

関連する問題