2015-01-18 4 views
9

Folgende compiliert in Klirren aber nicht in gcc:Mehrdeutige Funktionsaufruf mit zwei Parametern Pack

template <class... Ts, class... Args> 
void f(Ts&&..., Args&&...); 

int main() 
{ 
    f(); 
} 

Dies ist der Fehler, den ich in GCC erhalten:

main.cpp: In function 'int main()': 
main.cpp:30:7: error: no matching function for call to 'f()' 
    f(); 
    ^
main.cpp:30:7: note: candidate is: 
main.cpp:23:6: note: template<class ... Ts, class ... Args> void f(Ts&& ..., Args&& ...) 
void f(Ts&&..., Args&&...) 
    ^
main.cpp:23:6: note: template argument deduction/substitution failed: 
main.cpp:30:7: note: candidate expects 1 argument, 0 provided 
    f(); 
    ^

Wenn ich gebe ein Argument wie f(0) dann kompiliert es mit GCC, aber nicht mit Clang.

Fehler mit Klirren:

main.cpp:30:5: error: no matching function for call to 'f' 
    f(0); 
    ^
main.cpp:23:6: note: candidate function not viable: requires 0 arguments, but 1 was provided 
void f(Ts&&..., Args&&...) 
    ^
1 error generated. 

Wenn ich die gleiche Anzahl von expliziten Template-Argumente als Funktionsparameter geben dann kompiliert es mit beiden Compiler (das heißt f<int, int, int>(0, 0, 0)).

+8

Ich sehe nicht, wie das funktionieren soll. Wenn Sie 'f (1, 2, 3, 4)' oder sogar 'f (1, 2, 3, 4)' - nennen, die 'Ts' sind und die' Args' sind ? Wie kann der Compiler mitteilen, wo das erste und das zweite Ende beginnen? Sind es zwei und zwei, eins und drei, null und vier? –

+2

@IgorTandetnik Ich habe nicht erwartet, dass einer von ihnen funktioniert. –

+5

Reichen Sie einen Fehlerbericht "accept-invalid" ein. – Deduplicator

Antwort

2

Der zweite Parameter Template Pack Args tatsächlich abgeleitet wird:

A nachlauf Template-Parameter Pack (14.5.3) wird nicht anderweitig abgeleitet auf eine leere Folge von Schablonen Argumenten abgeleitet werden.

Berücksichtigt man dies, wird auch klar, dass z.B. f<int>(0) ist wohlgeformt. Ts wird jedoch niemals abgeleitet. [Temp.deduct.call]/1:

Wenn eine Packung nie abgeleitet wird Funktionsparameter in einem nicht abgeleiteten Kontext (14.8.2.5), die Art des Parameter Packs erscheint.

Beachten Sie, dass das vorherige Angebot nicht für Ts gilt, da es nicht nachläuft. Daher wird reiner Abzug immer fehlschlagen.

Verwandte Themen