Variadisches Template mit lambdas: Fehler mit g ++ aber läuft mit clang ++

9

Beim Spielen mit variantenbasierten Vorlagen, Klassen, Funktionen und Lambdas ( von hier ) habe ich festgestellt, dass der folgende Code mit% co_de läuft % während nicht mit clang++ :

ausgeführt wird %Vor%

Für g++ : coliru

Für clang : coliru

g++ gibt mehrdeutige g++ für operator() , func(val) und func(str) . Ich denke, die func(c) darf nicht mehrdeutig sein, da jede unterschiedliche Argumente hat.

Was ist das Problem mit operator() ?

    
mnciitbhu 28.10.2015, 06:08
quelle

1 Antwort

3

Das hat wenig mit Lambdas, variadischen Templates, Operatoren oder irgendwelchen fortgeschrittenen C ++ 1 {xy} -Sachen zu tun. Lassen Sie uns vereinfachen:

%Vor%

Dies kann weder in g++ noch in clang++ kompiliert werden. Das ist auch eine gute Sache, denn so wird die Sprache spezifiziert.

Wenn wir func in operator() ändern, lehnt g++ weiterhin das Programm ab, aber clang++ akzeptiert oder lehnt es ab, je nachdem, wie der Operator aufgerufen wird:

%Vor%

Das sieht für mich wie ein Clang Bug aus.

Um den obigen Code zu kompilieren, ist eine sehr kleine Änderung erforderlich:

%Vor%

Jetzt habe ich keine Ahnung, wie man die Pack-Erweiterung in der using-Direktive machen kann, oder ob es tatsächlich möglich ist. Aber es gibt einen Workaround:

%Vor%

Mit dieser Änderung kompiliert Ihr Code mit g++ und clang++ .

    
n.m. 28.10.2015, 06:57
quelle

Tags und Links