Was ich unten (unter OLD POST ) erzähle, sollte bis zu einem gewissen Grad zutreffen, aber das eigentliche Problem dabei ist, dass SFINAE falsch verwendet wird, daher bin ich mir nicht mehr so sicher, dass dies ein Fehler in gcc ist.
Eine Alias-Deklaration muss immer erfolgreich sein, Sie können dort keine SFINAE ausführen, da es sich nicht um eine Klassen- oder Funktionsdeklaration oder Spezialisierungen handelt (dies ist sinnvoll, da Sie keine Aliase spezialisieren können). Wenn die Aliasdeklaration nicht erfolgreich ist, ist das Programm fehlerhaft. Daher kann der Compiler davon ausgehen, dass die Alias-Deklaration erst dann erfolgreich sein wird, wenn Sie sie zwingen, eine solche Vorlage zu instanziieren.
Daher ist es für den Compiler durchaus akzeptabel zu glauben, dass dies sfinae_v_t<T,...>
immer T
dann der Fall ist, wenn das Programm nicht schlecht geformt ist. Daher wird sich herausstellen, dass in allen Fällen, in denen das Programm nicht schlecht geformt ist, die Teilspezialisierung nicht spezialisiert ist, und als solche wird es Ihnen sagen, dass dies schlecht geformt ist. (Das macht Clang).
Ich glaube nicht, dass der Compiler dazu gezwungen ist. Und wenn dies nicht der Fall ist und nur denkt, "Ok, sfinae_v_t
ist irgendein Typ, was auch immer.", Dann ist es nicht offensichtlich, dass dies eine erneute Erklärung ist. Ich denke, bis wir einen von ihnen instanziieren, ist es nichts Falsches, keinen Fehler zu werfen.
Aber wenn wir es instanziieren, sollte es entweder das Problem geben, dass wir eine erneute Deklaration haben oder dass das Programm aufgrund std::enable_if
des Template-Arguments schlecht geformt ist . GCC sollte mindestens einen von ihnen abholen, tut dies aber nicht.
Dies gilt auch absolut nicht für das einfachere Beispiel ohne std::enable_if
. Ich denke immer noch, dass dies ein Fehler in GCC ist, aber ich bin so verrückt, dass ich das nicht mehr mit Sicherheit sagen kann. Ich würde nur sagen, jemand sollte das als Fehler melden und die Leute von gcc darüber nachdenken lassen.
ALTER POST
Dies ist ein Fehler in gcc. Der Standard gibt uns Regeln für die Konvertierung einer Klassenvorlage in Funktionsvorlagen. Eine Klassenvorlage ist spezialisierter als eine andere, wenn ihre Funktion in der Reihenfolge der Teilfunktionsvorlagen vor der anderen steht.
Ich habe die Funktionen hier und jetzt erstellt. Gcc behauptet, dass das Aufrufen nicht eindeutig ist. Daher muss auch gesagt werden, dass die Klassenvorlagen gleichermaßen angegeben sind.
Hinweis: Wenn Sie den Standard sorgfältig lesen, stimmt der Compiler in meinem Kopf dem Klirren zu.