2012-08-12 24 views
6

Consideremos el siguiente código:¿La compilación de este código es un comportamiento estándar?

struct Undefined; 

template <typename T> 
void TemplateFunction() 
{ 
    Undefined obj; 
} 

int main() 
{ 
    return 0; 
} 

I era siempre la impresión de que las funciones de plantilla y los métodos de la plantilla (o métodos parte de una clase de plantilla), sólo se comprobará la sintaxis (a menos que se instancian) en cuyo caso el código anterior debe compilar.

El problema es que no se compila con Xcode (ver: 4.3.2, usando el compilador LLVM) y ahora me pregunto si el código no es estándar es decir, debe no compilar en un compilador conforme a el estándar C++ 03? El error de Xcode es:

variable tiene tipo incompleto "Indefinido"

Tenga en cuenta que en el código original, el objeto no definido es parte de la afirmación estática.

+1

[Ideone parece permitir que compile.] (Http://ideone.com/PHpFw) (gcc-4.3.4) –

+0

Compila bajo g ++ 4.6.3 en Linux, y no funciona bajo clang ++ (aunque si lo entiendo correctamente, Xcode usa clang ++ también) –

+0

Como era de esperar, compila con gcc 4.7 y una captura de 4.8 (linux en x86) – juanchopanza

Respuesta

7

El compilador tiene razón al rechazar el código, aunque otros compiladores lo aceptarán con mucho gusto. En particular, la cotización estaría dentro §14.6 [temp.res]/8

[...] Si hay especialización válida se puede generar para una definición de plantilla, y que la plantilla no se instancia, es la definición de plantilla mal formado, no requiere diagnóstico. [...] Si un tipo utilizado en un nombre no dependiente está incompleto en el punto en el que se define una plantilla, pero se completa en el punto en el que se realiza una instanciación, y si la integridad de ese tipo afecta si o no el programa está bien formado o afecta la semántica del programa, el programa está mal formado; [...]

Es decir, la plantilla es mal formados aunque el compilador no es necesario para diagnosticarla.

+0

Podría aclarar un poco: * ambos * clang y gcc muestran un comportamiento correcto, aunque uno de ellos rechaza este programa y otro lo compila con éxito? –

+3

@Nya: Sí, el programa está * mal formado *, por lo que clang tiene razón al rechazarlo. Pero no se requiere diagnóstico, por lo que gcc tiene razón al ignorar el problema. Eso no quiere decir que el programa sea correcto, solo que gcc no diagnosticó el error. Hasta cierto punto, esto sería el equivalente a * comportamiento indefinido * en tiempo de compilación. Puede parecer que * funciona * aunque es incorrecto. Tenga en cuenta que hay muchos casos donde no se requiere que los compiladores diagnostiquen, por ejemplo, dos definiciones diferentes de una plantilla 'en línea' es una violación de la ODR, pero los compiladores no están obligados a diagnosticar (y la mayoría no lo hace) –

Cuestiones relacionadas