В C99 это было законно:
void f(size_t sz) {
char arr[sz];
// ...
}
Однако это - массивы стеков с динамическим размером - были сброшены на С++ и не видели возврата в С++ 11.
AFAIK С++ был сделан с учетом совместимости с C, поэтому я задавался вопросом. Должен быть какой-то очень хороший аргумент, не включающий эту полезную функцию, правильно?
Все, что я мог подумать, было следующим:
Pros
- Экономия памяти за счет более разумного размера массива, который должен быть в стеке (временные буферы?).
- Меньше "умных указателей" (или, что еще хуже, ручной ввод ошибок
delete []
) и медленные распределения кучи. - Совместимость с C99.
Против
- Позволяет людям легко выделять слишком большие массивы в стеке, что позволяет переполнять.
- Сложнее для компиляторов.
Итак, почему они не включили его, когда импортировали другие функции C99?
Чтобы это не было закрыто как "субъективное" или "не конструктивное", я ищу цитаты из членов сообщества или ссылки на обсуждения, рассказывающие об этом, - с бонусами для быстрого SO-раунда, конечно.
Вместо того, чтобы рассматривать это как обсуждение Ponies vs Hamsters, рассматривайте его как исторический вопрос, просто интересуйтесь преимуществами и недостатками, которые были рассмотрены (если вообще).
РЕДАКТИРОВАТЬ. Как отметил Джеймс Макнеллис в комментариях ниже, С++ существовал до стандартизированных массивов переменной длины C99. Вы могли бы прочитать мой вопрос, а затем: " Почему они не добавили его?".