Lambdas in C++. Wie es funktioniert / Sudo Null IT News

Betrachten Sie dieses Codebeispiel:

void f(int i) { auto g = [i](auto j) {Rückkehr i + j; }; g = [i](auto j) {Rückkehr i – j; }; g(1); }

Beim Kompilieren

entstehen

Zeilenfehler

g = [i](automatisch j)

.

Warum passiert das?


Fakt ist, dass Lambdas in C++ nur syntaktischer Zucker über lokale Klassen/Strukturen mit einem gewissen sind [возможно шаблонным] Klammeroperator:

Klasse Lambda1 { int i; public: Lambda1(int i) : i(i) {} template auto operator()(Ty j) { return i + j; } }; Klasse Lambda2 {int i; public: Lambda2(int i): i(i) {} template auto operator()(Ty j) { return i – j; } }; void f(int i) {auto g = Lambda1(i); g = Lambda2(i); g(1); }

Jetzt den Fehler verursachen

[в строке g = Lambda2(i);]

wird deutlich: Lambda1 und Lambda2 sind verschiedene Klassen, die nichts voneinander wissen.

Diese Klassen mussten global gemacht werden, weil C++ unterstützt immer noch keine Template-Methoden in lokalen Klassen.

In zukünftigen Versionen von C++ wird es gültig sein, Folgendes zu schreiben: void f(int i) { class Lambda1 { int i; public: Lambda1(int i) : i(i) {} template auto operator()(Ty j) { return i + j; } }; auto g = Lambda1(i); Klasse Lambda2 {int i; public: Lambda2(int i): i(i) {} template auto operator()(Ty j) { return i – j; } }; g = Lambda2(i); g(1); }

Abschließend.

Damit die angegebenen Codebeispiele kompiliert werden können, reicht es aus, zu ersetzen

autog

auf der

std::function g

.

(Wie funktioniert es

std::Funktion

Dies ist ein Thema für einen separaten Artikel.)

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *