いいえ、待って、私と一緒に耐えてください...
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の公式の部分ではありません。
(もちろん、私はコンパイラーで遊んでいるだけなので、これを少々の塩で味わってください。)