2012-05-30 17 views
12

Cosa significa la seguente costruzione?Modello variadic C++ Esempio insolito

#include <iostream> 

template <int ...> struct s; 

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

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

E 'compilato da gcc 4.4.5+ e quando eseguito uscite 0.

+0

Emette un valore casuale sulla mia macchina. L'inizializzazione di 'i' viene in qualche modo ignorata e viene stampato il valore unitario di' i'. – jrok

+5

Non sembra legale. 's' non è mai definito (e non contiene un membro' xxx') ei template devono avere parametri non vuoti. (L'ho compilato con gcc 4.6.2, e ha stampato '32767', clang non lo compila). – Mankarse

+0

Cambiare i nomi di 's' o' xxx' non cambia il comportamento. Questo è quasi certamente un bug in gcc. Sembra che il bug venga attivato fornendo argomenti vuoti a un modello variadic. – Mankarse

risposta

13

ho riscritto il programma per questo:

template <int ...> struct s; 

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

    return i; 
} 

e compilato con il -S -switch, per ottenere l'output di montaggio che ho ripulito il seguente:

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

Ora, il mio asm è un po 'arrugginito, ma l'unico codice significativo sembra essere movl -4(%rbp), %eax, che imposta il valore di ritorno su qualsiasi cosa possa leggere da i. In altre parole, il programma restituisce semplicemente ciò che era in cima allo stack quando è stata immessa la funzione main. Questo sembra confermare il commento di @jrok che l'inizializzazione di i è in qualche modo ignorata. Nessun codice è stato generato per il mistico s<,>::xxx -expression.

Linea di fondo; questo sembra un bug del compilatore. Il compilatore dovrebbe aver dato un messaggio di errore.

Comprovare lato nota: ottengo uscita assemblaggio identici per il programma int main() { int i; return i; }.

+0

Bella detrazione. :) – Dennis