Bueno, el const int b[10];
original solo es útil cuando puede inicializar la matriz, por lo que los dos ejemplos de std::array
no funcionan en la práctica.
1:
std::array<const int, 10> c;
Este es el más cercano a const int c[10];
. El problema es que no habrá ningún constructor predeterminado para él, y dado que los elementos no son mutables, no vale la pena usar esto. Debe proporcionar alguna inicialización para ello en el constructor. Tal como está, dará un error de compilación porque el constructor predeterminado no inicializó los elementos.
Este código significa que c
es mutable, pero los elementos en sí no lo son. En la práctica, sin embargo, no hay mutaciones en c
que no afecten a los elementos.
2:
const std::array<int, 10> d;
Esto significa d
no es mutable, pero los elementos son de tipo mutable int
. Debido a que const
se propagará a los miembros, significa que la persona que llama aún no puede cambiar los elementos. Similar al ejemplo anterior, necesitará inicializar d
porque es const
.
En la práctica, se comportan de manera similar tanto con respecto a la mutabilidad, ya que las operaciones mutables en array
siempre tocan los elementos.
+1 aunque una matriz estática nunca se asigna en la pila. Se puede asignar una matriz _fixed size_ en la pila (declspec de almacenamiento automático) o en un segmento de datos global (declspec de almacenamiento estático). Trivia: en 'typedef int ints_t [10]; ints_t * ints = new ints_t(); 'is' ints' una matriz de tamaño fijo o una matriz dinámica? – sehe
Ambas matrices requieren inicialización cuando se declaran. En mi humilde opinión, no hay diferencia entre los dos: son exactamente los mismos desde una perspectiva algorítmica y de uso (prácticamente, los iteradores son iguales; 'const int *'). Francamente, la mejor manera de declarar es como dices en la respuesta, 'const std :: array c;' Esto lo hace muy específico, una matriz de constricciones. –
Nim