2012-01-14 10 views
12

A std::array<T> es esencialmente una matriz de estilo C envuelta en struct. La inicialización de struct s requiere llaves, y la inicialización de matrices también requiere llaves. Así que necesito dos pares de llaves:std :: array <T> inicialización

std::array<int, 5> a = {{1, 2, 3, 4, 5}}; 

Pero la mayor parte del código de ejemplo que he visto sólo utiliza un par de llaves:

std::array<int, 5> b = {1, 2, 3, 4, 5}; 

¿Cómo es que esto está permitido, y tampoco tiene las ventajas o inconvenientes en comparación con el primer approch?

+0

No estoy seguro de que _es_ permitido por la norma - posiblemente los compiladores que aceptan que el código se basan en una anterior C++ 11 borrador, o simplemente dar una advertencia ya que es una extensión que permite código mal formado. – ildjarn

+0

@ildjarn Según Johannes, está permitido. – fredoverflow

Respuesta

14

La ventaja es que tiene ... menos para escribir. Pero el inconveniente es que solo puede dejar llaves cuando la declaración tiene esa forma. Si deja fuera el =, o si la matriz es un miembro y la inicializa con member{{1, 2, 3, 4, 5}}, no solo puede aprobar un par de llaves.

Esto se debe a las preocupaciones sobre posibles ambigüedades de sobrecarga cuando las llaves se pasan a funciones, como en f({{1, 2, 3, 4, 5}}). Pero causó cierta discusión y se generó un informe de problema.

Esencialmente, la inicialización = { ... } siempre ha sido capaz de omitir los apoyos, como en

int a[][2] = { 1, 2, 3, 4 }; 

Eso no es nuevo. Lo que es nuevo es que se puede omitir el =, pero entonces debe especificar todos riostras

int a[][2]{ {1, 2}, {3, 4} }; 
+0

¿Puede proporcionar una cotización estándar que justifique tener solo un par de llaves? – fredoverflow

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 –

Cuestiones relacionadas