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; }
.
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
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
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