Nicht typisierter Referenzparameter / Argument
Warum kann das Template-Argument einer Nicht-Typ-Referenz keine andere Referenz sein (g ++ 4.8.1):
template <int& N> void test() { }
int x = 5;
int& p = x;
int main(){
test<x>(); //compiles fine
test<p>(); //error: could not convert template argument 'p' to 'int&'|
}
Ich kann nicht sehen, wo aus dem Standardp
verletzt irgendetwas, dies schienen die relevantesten Abschnitte zu sein (N3337):
[14.3.2] [.1] Ein Template-Argument für einen Nicht-Template-Template-Parameter ohne Typ muss eines der folgenden sein:
- für einen Nicht-Typ-Template-Parameter vom Typ Integral oder Aufzählung ein konvertierter konstanter Ausdruck (5.19) des Typs des Template-Parameters; ode
- der Name eines nicht typisierten Template-Parameters; ode
- Ein konstanter Ausdruck (5.19), der die Adresse eines Objekts mit statischer Speicherdauer und externer oder interner Verknüpfung oder einer Funktion mit externer oder interner Verknüpfung angibt, einschließlich Funktionsschablonen und Funktionsschablonen-IDs, jedoch ohne nicht statische Klassenmitglieder (Klammern werden ignoriert) als & id-Ausdruck, außer dass das & weggelassen werden kann, wenn der Name auf eine Funktion oder ein Array verweist, und weggelassen werden muss, wenn der entsprechende Template-Parameter eine Referenz ist; oder ....
[. 4]
[Hinweis: Temporäre Werte, unbenannte l-Werte und benannte l-Werte ohne Verknüpfung sind keine akzeptablen Vorlagenargumente, wenn der entsprechende Template-Parameter einen Referenztyp hat.
[. 5]
- Für einen Nicht-Typ-Vorlagenparameter vom Typ Verweis auf Objekt gelten keine Konvertierungen. Der Typ, auf den sich die Referenz bezieht, ist möglicherweise qualifizierter als der (ansonsten identische) Typ des Templatearguments. Der template-Parameter ist direkt an das template-Argument gebunden, das ein lWert sein soll.
p
sollte als ein Wert betrachtet werden, nicht wahr? Das einzige andere, woran ich denken konnte, war vielleicht ein Mangel an Verknüpfungen für Referenzen, aber das Hinzufügen vonextern int& p = x
hat es auch nicht behoben.