Я не использовал C очень много за последние несколько лет. Когда я прочитал этот вопрос сегодня, я наткнулся на некоторый синтаксис Си, с которым я не знаком.
По-видимому, в C99 допустим следующий синтаксис:
void foo(int n) {
int values[n]; //Declare a variable length array
}
Это похоже на довольно полезную функцию. Было ли когда-либо обсуждение добавления его к стандарту С++, и если да, то почему он был опущен?
Некоторые потенциальные причины:
- Волосатые для поставщиков компиляторов для реализации
- Несовместим с какой-либо другой частью стандарта
- Функциональность может быть эмулирована с помощью других конструкций С++
В стандарте С++ указывается, что размер массива должен быть постоянным выражением (8.3.4.1).
Да, конечно, я понимаю, что в примере игрушек можно использовать std::vector<int> values(m);
, но это выделяет память из кучи, а не из стека. И если мне нужен многомерный массив вроде:
void foo(int x, int y, int z) {
int values[x][y][z]; // Declare a variable length array
}
версия vector
становится довольно неуклюжей:
void foo(int x, int y, int z) {
vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Срезы, строки и столбцы также будут распространяться по всей памяти.
Глядя на обсуждение в comp.std.c++
, ясно, что этот вопрос довольно спорный с некоторыми очень тяжелыми именами по обе стороны аргумента. Совершенно очевидно, что a std::vector
всегда является лучшим решением.