Issue: eine generische Lambda (auf eine Template-Funktion), die die this
und ruft eine Memberfunktion von this
ohne explizite this->
fängt nicht kompilieren gcc. Wenn das Lambda nicht generisch ist oder wenn das Lambda nicht an eine andere Funktion übergeben, sondern an Ort und Stelle aufgerufen wird, kompiliert es sich mit einem expliziten this->
. Clang ist cool mit dem Code in allen Situationen.Aufruf `this` Memberfunktion von generic Lambda - Klirren vs gcc
Zeit für eine weitere Runde von clang vs gcc. Wer hat Recht?
template<typename TF>
void call(TF&& f)
{
f(1);
}
struct Example
{
void foo(int){ }
void bar()
{
call([this](auto x){ foo(x); });
}
};
int main()
{
Example{}.bar();
return 0;
}
- Mit
bar()
=call([this](auto x){ foo(x); });
- Klirren ++ 3.6+ kompiliert.
- g ++ 5.2+ wird nicht kompiliert.
error: cannot call member function 'void Example::foo(int)' without object call([this](auto x){ foo(x); });`
- Mit
bar()
=call([this](auto x){ this->foo(x); });
- Klirren ++ 3.6+ kompiliert.
- g ++ 5.2+ kompiliert.
- Mit
bar()
=call([this](int x){ foo(x); });
- Klirren ++ 3.6+ kompiliert.
- g ++ 5.2+ kompiliert.
- Mit
bar()
=[this](auto x){ foo(x); }(1);
- Klirren ++ 3.6+ kompiliert.
- g ++ 5.2+ kompiliert.
Warum ist die this->
notwendig, nur im Falle einer allgemeinen Lambda?
Warum ist die this->
nicht erforderlich, wenn das Lambda nicht an call
übergeben wird?
Wer ist nicht standardkonform?
Die von Ihnen notierten Inkonsistenzen weisen darauf hin, dass der Clang hier korrekt ist. –
Ohne auf den Standard zu schauen, kann ich mit absoluter Sicherheit sagen, dass Clang recht hat. Selbst wenn es nicht mit dem Standard übereinstimmt, ist es immer noch richtig; In diesem Fall ist der Standard falsch. Das Verhalten von GCC macht überhaupt keinen Sinn. –
[verwandt aber nicht ein Betrogener?] (Http://stackoverflow.com/q/20312062/819272) – TemplateRex