Esto parece ser diferente para varios compiladores.
Tanto Mircosoft como Borland usan la versión const char *, mientras que GNU proporciona la salida que describió.
Aquí hay un fragmento del C++ estándar:
14.8.2.1 Deducción de argumentos de plantilla a partir de una llamada a la función [temp.deduct.call]
Plantilla argumento deducción se realiza mediante la comparación de cada la plantilla de función tipo de parámetro (llámala P) con el tipo del argumento correspondiente de la llamada (llámala A) como se describe a continuación .
Si P no es un tipo de referencia:
- Si A es un tipo de matriz, el tipo de puntero producida por la conversión estándar-array-a puntero (4.2) se utiliza en lugar de A para tipo deducción; lo contrario,
- Si A es un tipo de función, el tipo de puntero producido por el conversión función-a-puntero estándar (4.3) se utiliza en lugar de un para el tipo de deducción; de lo contrario,
- Si A es un tipo cv-calificado, los cv-calificadores de nivel superior del tipo de A se ignoran para la deducción de tipo.
Si P es un tipo cv-calificado, los mejores cv-calificadores de nivel de tipo P son ignorados para la deducción de tipo. Si P es un tipo de referencia, el tipo a que se refiere por P se utiliza para el tipo de deducción
el compilador construir una lista de A
de la siguiente manera:
Argument: t d
A: char const[34] char[34]
Y lista de parámetros P
:
Parameter: c t
P: char const* char const& t[N]
De forma predeterminada, el compilador debe elegir los parámetros no referenciados. GNU está equivocado la segunda vez por alguna razón.
La salida es 'const char *, const char *' para mí en msvc – Marlon
La salida es como él dice, 'const char *, matriz ref, 34' con' gcc-4.3.4' (http: // ideone.com/ejyCS). – James
@ user511274 - Pregunta interesante :) –