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; }
.
fonte
2012-05-30 11:07:42
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
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
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