¿Por qué las matrices de longitud variable no forman parte del estándar de C ++?
No he usado mucho C en los últimos años. Cuando leoesta pregunta hoy me encontré con una sintaxis C con la que no estaba familiarizado.
Aparentemente enC99 La siguiente sintaxis es válida:
void foo(int n) {
int values[n]; //Declare a variable length array
}
Esto parece una característica bastante útil. ¿Hubo alguna vez una discusión sobre agregarlo al estándar de C ++ y, de ser así, por qué se omitió?
Algunas posibles razones:
Peludo para los proveedores de compiladores para implementarIncompatible con alguna otra parte de la norma.La funcionalidad se puede emular con otras construcciones de C ++El estándar de C ++ indica que el tamaño de la matriz debe ser una expresión constante (8.3.4.1).
Sí, claro que me doy cuenta de que en el ejemplo de juguete uno podría usarstd::vector<int> values(m);
, pero esto asigna memoria del montón y no la pila. Y si quiero una matriz multidimensional como:
void foo(int x, int y, int z) {
int values[x][y][z]; // Declare a variable length array
}
lavector
la versión se vuelve bastante torpe:
void foo(int x, int y, int z) {
vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Los segmentos, filas y columnas también se distribuirán en toda la memoria.
Mirando la discusión encomp.std.c++
está claro que esta pregunta es bastante controvertida con algunos nombres muy pesados en ambos lados del argumento. Ciertamente no es obvio que unstd::vector
Siempre es una mejor solución.