auto
deduce cada lista de inicializadores encerrados en un std::initializer_list<T>
. (Ver §7.1.6.4.6 incluyendo el ejemplo). Desafortunadamente no puede inicializar una matriz o incluso std::array
desde un std::initializer_list
una vez que la haya obtenido, pero puede usar un std::vector
.
#include <vector>
#include <array>
#include <initializer_list>
int main()
{
auto x = {1,2,3};
std::array<int, 3> foo1 = x; // won't work for whatever reason
std::vector<int> foo2 = x; // works as expected
return 0;
}
Por supuesto, esto frustra todo el propósito de lo que estás tratando de hacer.
He intentado escribir un trabajo en torno llamada make_array
pero tuvo que darse cuenta de que esto no puede siempre funcionar como el tamaño de un initializer_list
no es parte de sus argumentos de plantilla y por lo que sólo una instancia de un make_array
plantilla para cada T
. Esto apesta.
template<typename T>
auto make_array(const std::initializer_list<T>& x)
-> std::array<T, x.size()> { } // maaah
Bueno, al parecer, se puede ir por el hack-variadic plantilla menciona aquí How do I initialize a member array with an initializer_list?
¿Por qué todo el mundo quiere abusar de las nuevas características del lenguaje. –
@Martin: no tengo ninguna intención de abusar de un lenguaje muy bonito como C++. Solo tengo curiosidad sobre las razones (técnicas, éticas, etc.) detrás de esta decisión. –
@Martin: debes tocar las superficies para saber dónde están las paredes antes de comenzar a correr a ciegas. – Klaim