Указатели и массивы в C++

1,00
р.
Прошу объяснить, в чем разница в следующих листингах:
1)
#include using namespace std
int main() { int n cin >> n int a[n] for (int i=0 i> a[i] cout << endl for (int i=0 i<n i++) cout << a[i] << " " return 0 } <br>2)
#include using namespace std
int main() { int n cin >> n int * a = new int[n] for (int i=0 i> a[i] cout << endl for (int i=0 i<n i++) cout << a[i] << " " delete [] a return 0 } <br>Насколько я знал, в первом варианте n должна быть const, и, собственно, код на листинге 1 не должен компилироваться, однако он работает (оттестировано на gcc-c++-4.4.0-mingw32)! Почему?


Ответ
Ни один из стандартов C++, даже C++11, не включает в себя variable length arrays, просто некоторые компиляторы поддерживают их в качестве расширений. Такая же история с типом long long, правда его все-таки включили в C++11. Чтобы заставить g++ ругаться на такие нестандартные расширения нужно добавить опцию -pedantic:
$ cat test.cpp #include
int main() { long long int a std::cin >> a int b[a] } $ g++ test.cpp -pedantic test.cpp: In function ‘int main()’: test.cpp:4:5: warning: ISO C++ 1998 does not support ‘long long’ [-Wlong-long] test.cpp:6:12: warning: ISO C++ forbids variable length array ‘b’ [-Wvla] $ g++ test.cpp --std=c++0x -pedantic test.cpp: In function ‘int main()’: test.cpp:6:12: warning: ISO C++ forbids variable length array ‘b’ [-Wvla]