c++ - una - Usando std:: array con listas de inicialización
ingresar datos en una matriz c++ (2)
Para añadir a la respuesta aceptada:
std::array<char, 2> a1{''a'', ''b''};
std::array<char, 2> a2 = {''a'', ''b''};
std::array<char, 2> a3{{''a'', ''b''}};
std::array<char, 2> a4 = {{''a'', ''b''}};
Todos trabajan en GCC 4.6.3 (Xubuntu 12.01). Sin embargo,
void f(std::array<char, 2> a)
{
}
//f({''a'', ''b''}); //doesn''t compile
f({{''a'', ''b''}});
Lo anterior requiere dobles llaves para compilar. La versión con llaves individuales produce el siguiente error:
../src/main.cc: In function ‘int main(int, char**)’:
../src/main.cc:23:17: error: could not convert ‘{''a'', ''b''}’ from ‘<brace-enclosed initializer list>’ to ‘std::array<char, 2ul>’
No estoy seguro de qué aspecto de la inferencia / conversión de tipo hace que las cosas funcionen de esta manera, o si esto es una peculiaridad de la implementación de GCC.
A menos que me equivoque, debería ser posible crear un std: array de estas maneras:
std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });
Y, sin embargo, al usar GCC 4.6.1 no puedo hacer funcionar ninguno de estos. El compilador simplemente dice:
expected primary-expression before '','' token
y sin embargo, las listas de inicialización funcionan bien con std :: vector. Entonces, ¿cuál es? ¿Me equivoco al pensar que std :: array debería aceptar las listas de inicialización, o el equipo de la Biblioteca de C ++ de GNU es un tonto?
std::array
es divertido. Se define básicamente así:
template<typename T, int size>
struct std::array
{
T a[size];
};
Es una estructura que contiene una matriz. No tiene un constructor que tome una lista de inicializadores. Pero std::array
es un agregado de las reglas de C ++ 11 y, por lo tanto, se puede crear mediante la inicialización de agregados. Para agregar la inicialización de la matriz dentro de la estructura, necesita un segundo conjunto de llaves:
std::array<std::string, 2> strings = {{ "a", "b" }};
Tenga en cuenta que el estándar sugiere que las llaves adicionales se pueden eliminar en este caso. Así que es probable que sea un error de GCC.