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++
:
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()
?
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:
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++
.