2011-08-18 13 views
13

En C++ 0x (ohh !, lea C++ 11), tenemos inferencia de tipo automática. Una cosa que me hizo curioso fue que no puedo crear una matriz de variables automáticas. Por ejemplo:¿Por qué no puedo crear una matriz de variables automáticas?

auto A[] = {1, 2, 3, 4}; // Error! 

¿Alguna idea de por qué esto podría haberse denegado?

+3

¿Por qué todo el mundo quiere abusar de las nuevas características del lenguaje. –

+3

@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. –

+2

@Martin: debes tocar las superficies para saber dónde están las paredes antes de comenzar a correr a ciegas. – Klaim

Respuesta

10

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?

5

Porque {1, 2, 3, 4} es una construcción puramente sintáctica, no es una expresión y no tiene un tipo. Por lo tanto, auto no puede deducir su tipo de ella.

+2

Es una lástima, sé idiomas que han sido capaces de hacer eso durante años – hamstergene

+4

Pero 'auto x = {1,2}' declara 'x' como' std :: initializer_list '. Entonces esto no es exactamente cierto. – pmr

+1

@DeadMG: Ok, ¿qué piensas de auto x = {1, 2, 3, 4} ;? ¿Va a funcionar o no? ¿Qué valor contendrá x? Si x es 1, ¿cómo dedujo el compilador su tipo ahora? –

Cuestiones relacionadas