2011-04-09 17 views

Respuesta

6

El segundo evitará que se copia a una nueva matriz no constante

boost::array<const int, 2> y = {0, 1}; 
boost::array<int, 2> y1 = y; // error! 

Dado que yo esperaría que para trabajar, probablemente me iría con la primera opción. Pasar el segundo a las plantillas que esperan un boost::array<T, N> evitará que esas plantillas modifiquen su parámetro (incluso si es una copia). El primero "simplemente funcionaría", ya que el parámetro tendría el tipo boost::array<int, 2>.

+0

¡Gracias! Por cierto, ¿por qué pasar por el valor ignora el calificador const? ¿Es así como funciona la deducción del tipo de argumento? – pic11

+0

@pic sí. Pienso que es algo bueno. Vea los comentarios en http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/ –

+0

Schaub. Sí, tiene perfecto sentido. Gracias por el enlace. – pic11

0

A const int y int en este contexto son prácticamente lo mismo. No hay nada que pueda hacer a un array<int,2> que no puede hacer a un array<const int, 2>. Si en lugar de int tiene alguna clase, entonces habría una diferencia. con array<const MyClass, 2> no podrá llamar a métodos no const en los elementos de la matriz.
const array<MyClass, 2> es más fuerte en el sentido de que no se puede modificar nada de otra manera. No puede llamar a métodos no const de los elementos y; no puede cambiar la matriz en sí reemplazando los elementos, digamos usando operator[].

+0

No puede reemplazar los elementos a través de 'operator []' en la otra alternativa, tampoco. – Potatoswatter

2

Es realmente una diferencia estilística.

Si intenta llamar al assign en un , el error del compilador dice que no hay una función que concuerde. Si haces lo mismo con un array<const T>, apunta a la operación no válida dentro de assign.

Creo que const array expresa mejor el intento, y se parece más a la declaración de matriz de estilo C correspondiente. Pero no haría un esfuerzo para cambiar las cosas, por ejemplo, en el código heredado o dentro de una plantilla que podría generar un array<const T>.

+0

Iré con ** const array **. Gracias. – pic11

Cuestiones relacionadas