¿Por qué las deducciones de tipo de plantilla y auto son diferentes para los inicializadores reforzados?
Entiendo que, dado un inicializador apuntalado,auto
deducirá un tipo destd::initializer_list
, mientras que la deducción del tipo de plantilla fallará:
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
Incluso sé dónde se especifica en el estándar C ++ 11: 14.8.2.5/5 bullet 5:
[Es un contexto no deducido si el programa tiene] Un parámetro de función para el que el argumento asociado es una lista de inicializadores (8.5.4) pero el parámetro no tiene std :: initializer_list o referencia a std calificado como cv-initializer_list tipo. ElEjemplo:
plantilla void g (T);
g ({1,2,3}); // error: no se deduce argumento para T
—ejemplo final ]
Lo que no sé o entiendo espor qué Esta diferencia en el tipo de comportamiento de deducción existe. La especificación en el CD de C ++ 14 es la misma que en C ++ 11, por lo que, presumiblemente, el comité de estandarización no ve el comportamiento de C ++ 11 como un defecto.
¿Alguien sabe por qué?auto
deduce un tipo para un inicializador reforzado, pero las plantillas no están permitidas? Si bien las explicaciones especulativas de la forma "esta podría ser la razón" son interesantes, me interesan especialmente las explicaciones de personas quesaber ¿Por qué el estándar fue escrito como estaba.