por favor considere este código:SFINAE con parámetros inválidos de tipo de función o tipo de matriz?
template<typename T>
char (&f(T[1]))[1];
template<typename T>
char (&f(...))[2];
int main() { char c[sizeof(f<void()>(0)) == 2]; }
me esperaba que hacer SFINAE y eligiendo la segunda sobrecarga, ya que la sustitución de T
en T[1]
rendimientos
void [1]()
¿Qué es un tipo no válido, por supuesto. El ajuste de los tipos de parámetros (matriz-> puntero) se realiza después de sustituir los parámetros de la plantilla en parámetros de funciones y se comprueba la validez de los tipos resultantes, como se describe en 14.8.2 [temp.deduct].
Pero tanto Comeau y GCC fallan para compilar el anterior. Ambos con diferentes diagnósticos.
Comeau dice:
"ComeauTest.c", line 2: error: array of functions is not allowed
char (&f(T[1]))[1];
CCG dice (versión 4.3.3
):
error: ISO C++ forbids zero-size array
c
Significado, GCC no deja de sustituir, pero elige la primera sobrecarga de f
, devolviendo un sizeof
de 1, en lugar de no sustituirlo por adelantado como Comeau.
¿Qué compilador tiene razón y mi código es válido? Consulte o cite la sección estándar adecuada en su respuesta. ¡Gracias!
actualización: El estándar en sí contiene un ejemplo de ello en la lista a 14.8.2/2
. No sé por qué me daba primero:
template <class T> int f(T[5]);
int I = f<int>(0);
int j = f<void>(0); // invalid array
Mientras que el ejemplo es de carácter informativo, muestra la intención de todos los párrafos misteriosos y parece mostrar el código anterior debería funcionar y rechazar la primera sobrecarga.
litb pidiendo una aclaración normas es una contradicción :) – JaredPar
hice la misma en Usenet, pero envió la pregunta aquí también, así que puede ser archivada en SO y la gente lo encontrará en la búsqueda de SO. Enlace de descarga directa: http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/78f8cd8cf27778e3 –
pensé litb es el estándar ...? –