web-dev-qa-db-ja.com

C ++は可変長配列をサポートしていますか?

いいえ、待って、私と一緒に耐えてください...

VLAは常にGCC拡張でしたが、C99で採用されました。

[C99: 6.7.5.2/4]:サイズが存在しない場合、配列タイプは不完全なタイプです。サイズが式ではなく*の場合、配列型はサイズが指定されていない可変長配列型であり、関数プロトタイプスコープの宣言でのみ使用できます。それでも、そのような配列は完全な型です。 サイズが整数定数式で、要素の型が既知の定数サイズである場合、配列型は可変長配列型ではありません。 それ以外の場合、配列型は可変長配列型です。

C99はISO/IEC 9899:1999とも呼ばれます。

今:

[C++11: 1.1/2]:C++は、ISO/IEC 9899:1999で指定されているCプログラミング言語に基づく汎用プログラミング言語です(以下、C標準と呼びます)。 C++は、Cによって提供される機能に加えて、追加のデータ型、クラス、テンプレート、例外、名前空間、演算子のオーバーロード、関数名のオーバーロード、参照、空きストア管理演算子、および追加のライブラリー機能を提供します

それで、C++ 11にもVLAがあってはいけませんか?

その余裕のある表現は、C99のすべてがC++ 11にあることを意味するものではありません。あなたが引用したのは単なる紹介文です。

このC99機能は、実質的にオーバーライドであり、他の「継承」機能と同様に、C++自体のセマンティクスによって:

[C++11: 8.3.4/1]:宣言内T Dここで、Dの形式は

D1 [定数式opt] attribute-specifier-seqopt

[..]

これは、C++で提供される唯一の配列宣言構文です。

この違いについては、「Cとの互換性」節では触れられていないことに注意してくださいC.1

定数式の定義は、2つの言語で異なります。

const size_t size = 5;
int array[size]; // array in C++, VLA in C

これは私のためにコンパイルされます:(-std=c++0x付きのg ++​​ 4.6)。しかし、-pedanticでコンパイルできません(@MarkBに感謝します)。代わりに、「template.cpp:7:12:警告:ISO C++は可変長配列 ‘n’ [-Wvla]を禁止しています

int main(int argc, char ** argv) {
    int n[argc];
}

したがって、nのサイズは、コンパイラーによってコンパイル時に知ることができません。 これはGNU C++への拡張ですか? これはGNU=拡張機能のようであり、VLAはC++ 11の公式の部分ではありません。

(もちろん、私はコンパイラーで遊んでいるだけなので、これを少々の塩で味わってください。)

3
Aaron McDaid