[c++] ¿Hay alguna razón para tamaño cero std :: array en C ++ 11?


1 Answers

Un uso que se me ocurre es que el retorno de matrices de longitud cero es posible y tiene una funcionalidad que se debe verificar específicamente.

Por ejemplo, consulte la documentación en la función std::array empty() . Tiene el siguiente valor de retorno:

true if the array size is 0, false otherwise.

http://www.cplusplus.com/reference/array/array/empty/

Creo que la capacidad de devolver y verificar matrices de 0 longitudes está en línea con el estándar para otras implementaciones de tipos stl, por ejemplo. Vectores y mapas y por lo tanto es útil.

Question

Considere la siguiente pieza de código, que es perfectamente aceptable por un compilador C ++ 11:

#include <array>
#include <iostream>

auto main() -> int {
  std::array<double, 0> A;

  for(auto i : A) std::cout << i << std::endl;

  return 0;
}

De acuerdo con el estándar § 23.3.2.8 [Arrays de tamaño cero ]:

1 matriz deberá proporcionar soporte para el caso especial N == 0 .

2 En el caso de que N == 0 , begin() == end() == valor único. El valor de retorno de
data() está especificado.

3 El efecto de llamar a front() o back() para una matriz de tamaño cero no está definido.

4 Member swap() función swap() tendrá una especificación noexcept que es equivalente a noexcept(true) .

Como se muestra arriba, std::array s de tamaño cero son perfectamente permitidos en C ++ 11, en contraste con arreglos de tamaño cero (por ejemplo, int A[0]; ) donde están explícitamente prohibidos, sin embargo, son permitidos por algunos compiladores ( ej., GCC) en el costo del comportamiento indefinido.

Considerando esta "contradicción", tengo las siguientes preguntas:

  • ¿Por qué el comité de C ++ decidió permitir std::array s de tamaño cero?

  • ¿Hay algún uso valioso?




En realidad, hay bastantes casos en los que desea poder hacer esto. Está presente en muchos otros idiomas también. Por ejemplo, Java en realidad tiene Collections.emptyList() que devuelve una lista que no es solo de tamaño cero, sino que no se puede expandir o cambiar de tamaño o modificar.

Un ejemplo de uso podría ser si tuviera una clase que representara un autobús y una lista de pasajeros dentro de esa clase. La lista puede tener una inicialización lenta, creada solo cuando sube el pasajero. Sin embargo, si alguien llama a getPassengers() se puede devolver una lista vacía en lugar de crear una lista nueva cada vez para informar de que está vacía.

La devolución del valor nulo también funcionaría para la eficiencia interna de la clase, pero haría la vida mucho más complicada para todos los usuarios de la clase, ya que cada vez que llame a getPassengers() tendrá que getPassengers() el resultado. En cambio, si obtiene una lista vacía entonces siempre que su código no suponga que la lista no está vacía, no necesita ningún código especial para manejarlo como nulo.




Related