Пусть вам дана функция
template <class T>Как вы думаете, какие типы возможно передать в foo()? Любые? Любые, кроме void? А вот и нет!
void foo(const T &) {}
Если мы воспользуемся variable-length array (в Cтандарте C++ его нет, зато есть в расширениях GCC) и попробуем передать в
foo():int n = 42;
int a[n];
foo(a);
то получим эпичную ошибку:main.cpp:34:28: note: variable-sized array type ‘int [n]’ is not a valid template argument
А еще variable-length array интересен тем, что sizeof() от него вычисляется в рантайме. Во время компиляции это невозможно, поскольку мы не знаем размер массива.