Por que não há std::initializer_list
uma linguagem central embutida?
Parece-me que é um recurso bastante importante do C ++ 11 e ainda não tem sua própria palavra-chave reservada (ou algo parecido).
Em vez disso, initializer_list
é apenas uma classe de modelo da biblioteca padrão que tem um especial implícito mapeamento da nova sintaxe de lista de inicialização com suporte {...}
que é tratada pelo compilador.
À primeira vista, essa solução é bastante hacky .
É assim que novas adições à linguagem C ++ serão implementadas: por funções implícitas de algumas classes de modelo e não pela linguagem central ?
Considere estes exemplos:
widget<int> w = {1,2,3}; //this is how we want to use a class
por que uma nova classe foi escolhida:
widget( std::initializer_list<T> init )
em vez de usar algo semelhante a qualquer uma dessas idéias:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- uma matriz clássica, você provavelmente poderia adicionar
const
aqui e ali - três pontos já existem na linguagem (var-args, agora modelos variadic), por que não reutilizar a sintaxe (e torná-la integrada )
- apenas um contêiner existente, poderia adicionar
const
e&
Todos eles já fazem parte da linguagem. Eu só escrevi minhas 3 primeiras idéias, tenho certeza que existem muitas outras abordagens.
std::array<T>
não é mais 'parte da linguagem' do que std::initializer_list<T>
. E esses não são os únicos componentes da biblioteca nos quais a linguagem depende. See new
/ delete
, type_info
, vários tipos de exceção, size_t
etc.
const T(*)[N]
, porque isso se comporta de maneira muito semelhante ao modo como std::initializer_list
funciona.