schrieb ich das Programm so aus:
template <int ...> struct s;
int main() {
int i = s<,>::xxx;
return i;
}
und mit dem -S
-Schalter zusammengestellt, Montag Ausgabe, die ich auf den folgenden gereinigt zu bekommen:
main:
pushq %rbp
movq %rsp, %rbp
movl -4(%rbp), %eax
popq %rbp
ret
Nun, meinem asm ist ein bisschen rostig, aber der einzige signifikante Code scheint movl -4(%rbp), %eax
zu sein, der den Rückgabewert auf alles setzt, was er von i
lesen kann. Mit anderen Worten, das Programm gibt einfach zurück, was oben auf dem Stapel war, wenn die main
-Funktion eingegeben wurde. Dies scheint @ Jroks Kommentar zu bestätigen, dass die Initialisierung von i
irgendwie ignoriert wird. Für den mystischen s<,>::xxx
-ausdruck wurde kein Code generiert.
Untere Zeile; Das sieht wie ein Compilerfehler aus. Der Compiler sollte eine Fehlermeldung erhalten haben.
Nebenbei Hinweis: Ich bekomme identische Montage-Ausgang für das Programm int main() { int i; return i; }
.
Es gibt einige zufällige Werte auf meinem Rechner aus. Die Initialisierung von "i" wird irgendwie ignoriert und der vereinheitlichte Wert von "i" wird gedruckt. – jrok
Es sieht nicht legal aus. 's' ist niemals definiert (und enthält kein' xxx'-Member) und Templates müssen nichtleere Parameter erhalten. (Ich habe es mit gcc 4.6.2 kompiliert und es hat '32767' ausgedruckt, clang kompiliert es nicht). – Mankarse
Das Ändern der Namen von 's' oder' xxx' ändert das Verhalten nicht. Dies ist mit ziemlicher Sicherheit ein Fehler in gcc. Es scheint, dass der Fehler ausgelöst wird, indem einer variadischen Vorlage leere Argumente übergeben werden. – Mankarse