2012-05-30 26 views
12

¿Qué significa la siguiente construcción?C++ plantilla variadica ejemplo inusual

#include <iostream> 

template <int ...> struct s; 

int main() { 
    int i = s<,>::xxx; 

    std::cout << i << std::endl; 
} 

se compila por gcc 4.4.5+ y cuando se ejecuta salidas 0.

+0

Muestra algún valor aleatorio en mi máquina. La inicialización de 'i' se ignora de alguna manera y se imprime el valor unificado de' i'. – jrok

+5

No parece legal. 's' nunca se define (y no contiene un miembro' xxx') y las plantillas deben tener parámetros no vacíos. (Lo compilé con gcc 4.6.2, e imprimió '32767', clang no lo compilará). – Mankarse

+0

Cambiar los nombres de 's' o' xxx' no cambia el comportamiento. Esto es casi seguro un error en gcc. Parece que el error se desencadena mediante el suministro de argumentos vacíos a una plantilla variadic. – Mankarse

Respuesta

13

Reescribí el programa a esto:

template <int ...> struct s; 

int main() { 
    int i = s<,>::xxx; 

    return i; 
} 

y compilado con el -S -switch, para obtener una salida asamblea que Limpié a lo siguiente:

main: 
     pushq %rbp 
     movq %rsp, %rbp 
     movl -4(%rbp), %eax 
     popq %rbp 
     ret 

Ahora, mi asm está un poco oxidado, pero el único código significativo parece ser movl -4(%rbp), %eax, que establece el valor de retorno a cualquier cosa que pueda leer en i. En otras palabras, el programa simplemente devuelve lo que estaba en la parte superior de la pila cuando se ingresó la función main. Esto parece corroborar el comentario de @jrok de que la inicialización de i se ignora de alguna manera. No se ha generado ningún código para la expresión mística s<,>::xxx.

Línea inferior; esto parece un error de compilación. El compilador debería haber dado un mensaje de error.

Nota lateral que corrobora: obtengo la salida de ensamblaje idéntica para el programa int main() { int i; return i; }.

+0

Buena deducción. :) – Dennis