Почему массивы переменной длины не являются частью стандарта C ++?
Я не очень много использовал C в последние несколько лет. Когда я читаюэтот вопрос сегодня я натолкнулся на некоторый синтаксис Си, с которым я не был знаком.
Видимо вC99 следующий синтаксис действителен:
void foo(int n) {
int values[n]; //Declare a variable length array
}
Это кажется довольно полезной функцией. Были ли когда-нибудь дискуссии о добавлении его в стандарт C ++, и если да, то почему он был опущен?
Некоторые потенциальные причины:
Волосатость для поставщиков компиляторов для реализацииНесовместим с какой-либо другой частью стандартаФункциональность можно эмулировать с другими конструкциями C ++Стандарт C ++ утверждает, что размер массива должен быть постоянным выражением (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++
ясно, что этот вопрос довольно спорный с некоторыми очень тяжелыми именами по обе стороны аргумента. Это, конечно, не очевидно, чтоstd::vector
всегда лучшее решение.