Der Abzug für auto
ist das gleiche wie Vorlage Abzug. Von [dcl.spec.auto]:
Wenn eine Variable deklariert ein Platzhalter-Typ unter Verwendung initialisiert wird, [...], die abgeleitete Rückgabetyp oder Variablentyp vom Typ seines initializer bestimmt ist. Wenn der Platzhalter der automatische Typspezifizierer ist, wird der abgeleitete Typ anhand der Regeln für die Ableitung von Vorlagenargumenten ermittelt. Wenn der Platzhalter auto
Typspezifizierer, ist, wird der abgeleitete Typ anhand der Regeln für die Vorlageargumentableitung bestimmt.
Wenn wir also entweder:
auto f = foo<A>;
auto b = bar<A>;
Wir Typ Abzug durchführen, als ob wir genannt (TC Wortwahl leihen):
template <typename M> void meow(M);
meow(foo<A>);
meow(bar<A>);
und unter Verwendung der abgeleiteten Geben Sie M
als den Typ f
bzw. b
ein.
Aber nach [temp.deduct.type], Hervorhebung von mir:
Wenn ein Template-Parameter nur in nicht-abgeleitete Kontexten verwendet wird und nicht explizit angegeben wird, nicht Vorlage Argument Abzug.
Die nicht abgeleiteten Kontexte sind:
- [...]
- Ein Funktionsparameter für das Argument Abzug nicht durchgeführt werden kann, weil die zugehörige Funktion Argument ist eine Funktion, oder eine Reihe von überladenen Funktionen (13.4) und eine oder mehrere der folgenden Bedingungen zutrifft:
- mehr als eine Funktion übereinstimmt, die Funktion Parametertyp (was zu einer mehrdeutigen Abzug), oder
- keine Funktion entspricht die Funktion Parametertyp oder
- der Satz von Funktionen als Argument geliefert enthält eine oder mehr Funktionsschablonen.
- [...]
In beiden Fällen sind das Argument, eine Reihe von überladenen Funktionen ist, die eine oder mehr Funktionsschablonen enthalten -, die einen nicht-abgeleitete Kontext macht, so Template-Argument Abzug versagt. Somit ist clang korrekt, wenn es beide Initialisierungen zurückweist.
Clang lehnt beide Fälle ab. –
g ++ 4.9.0 scheint die zweite zu akzeptieren – gd1
@ T.C., G ++ 4.9.2 kompiliert den Code und erzeugt eine Ausgabe, die der Beschreibung von OP entspricht. –