2012-05-30 8 views
12

Was bedeutet folgende Konstruktion?C++ variadic Vorlage ungewöhnliches Beispiel

#include <iostream> 

template <int ...> struct s; 

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

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

Es wird von gcc kompilierten 4.4.5+ und wenn 0 Ausgänge ausgeführt.

+0

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

+5

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

+0

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

Antwort

13

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

+0

Netter Abzug. :) – Dennis

Verwandte Themen