Por que a dedução automática e de tipo de modelo é diferente para inicializadores armados?
Eu entendo que, dado um inicializador apoiado,auto
deduzirá um tipo destd::initializer_list
, enquanto a dedução do tipo de modelo falhará:
auto var = { 1, 2, 3 }; // type deduced as std::initializer_list<int>
template<class T> void f(T parameter);
f({ 1, 2, 3 }); // doesn't compile; type deduction fails
Eu até sei onde isso é especificado no padrão C ++ 11: 14.8.2.5/5 bullet 5:
[É um contexto não deduzido se o programa tiver] Um parâmetro de função para o qual o argumento associado é uma lista de inicializadores (8.5.4), mas o parâmetro não possui std :: initializer_list ou referência a possivelmente cv-qualified std :: initializer_list tipo. [Exemplo:
template void g (T);
g ({1,2,3}); // erro: nenhum argumento deduzido para T
—exemplo final ]
O que eu não sei ou entendo éporque esta diferença no comportamento de dedução de tipo existe. A especificação no C ++ 14 CD é a mesma que no C ++ 11, então presumivelmente o comitê de padronização não vê o comportamento do C ++ 11 como um defeito.
Alguém sabe porqueauto
deduz um tipo para um inicializador armado, mas os modelos não são permitidos? Enquanto explicações especulativas da forma "esta poderia ser a razão" são interessantes, estou especialmente interessado em explicações de pessoas queconhecer porque o padrão foi escrito do jeito que foi.