Funktioniert der C++11 haben keine Unterstützung für die lokalen Funktionen?
Nun, es sind Lambda-Ausdrücke in C++, es scheint wirklich so dumm, dass ich kann nicht erklären, eine lokale Funktion...
z.B.:
Kann ich deklarieren Sie einen Typ in einer Funktion Körper, auch initialisieren Sie es als eine Tabelle der Werte. Aber ich kann nicht eine Hilfsfunktion erstellen, die arbeitet mit, dass die Daten geben - weil ich kann nicht erklären, eine Funktion in einer Funktion, und ich kann nicht finden, die Daten geben, die außerhalb der Funktion, da es nur in diesem Rahmen.
Es gibt Zeiten, wenn es ganz einfach zu ziehen, den Datentyp, die Funktion, und definieren Sie meine Daten geben und Helfer-Funktionen (lokale Datei, Umfang) - aber es gibt Zeiten, wenn es nicht wirklich eine plausible Lösung - z.B. beim initialisieren der Tabelle mit inline-Lambda-Ausdrücke, die sich auf einen lokalen Gültigkeitsbereich von Variablen (oder dieses).
Keine Ahnung, ob die Unterstützung für die lokalen Funktionen kommt, ist bereits definiert, oder, warum, die Sie sind schwierig, für die compiler-Autoren umzusetzen und damit nicht ein Teil der standard?
- Was wäre eine lokale Funktion geben, dass sich nicht einfach so leicht erreicht werden, mit
auto
+ lambda? - Lokale Funktionen sind viel schwieriger zu implementieren als die lokalen Variablen, obwohl es möglich ist, den gleichen Weg Lambda-Ausdrücke implementiert sind.
- Vielleicht nichts in der vollständigen C++11? Obwohl nicht sicher, was adv. Deklaration einer lambda verfügt über einen benannten örtlichen entweder... scheint, wie wenn der compiler verarbeiten kann man es verarbeiten kann, die andere nicht? Und ich finde, die Regeln sollten ähnlich sein - nur dass dieser Sie nicht erfassen kann alles, was mit einer lokalen Funktion, also ja, einfacher...
- Ich persönlich bin gegen die lokalen Typen. Sie unnötigerweise erschwert das Parsen und nur selten verwenden, und (zumindest in C++03), können Sie nicht als Vorlage verwendet werden Argumente... ich bevorzuge anonyme namespaces.
- "Obwohl nicht sicher, was adv. Deklaration einer lambda verfügt über eine benannte lokale, entweder..." Naja der Hauptvorteil ist, dass es legal ist/unterstützt in der Erwägung, dass eine benannte lokale Funktion ist nicht. ;-]
- Sie können verwendet werden als template-Argumente in C++11.
- Ich vermute, dass das, was jemand nach, wenn Sie wollten "lokale Funktionen" und lambdas wirklich nicht machen würde, ist in der Tat die Fähigkeit zu konvertieren Erfassung von lambda-zu einer normalen Funktion Zeiger. 'Cos IIRC GCC können Sie die Adresse einer verschachtelten Funktion, und nannte es "magisch" stellt den Kontext (siehe chill Antwort zu erwähnen, Trampoline). Aber der C++ - standard ist nicht zu verlangen, dass Implementierungen in der Lage sein, das zu tun.
- die Fähigkeit zum konvertieren einer Erfassung von lambda-zu einer normalen Funktion Zeiger" Ehrlich gesagt, das klingt beängstigend. ;-/
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine lokalen Funktionen, aber Sie sind nicht so nützlich, ohne Verschluss, das heißt, den Zugriff auf die lokalen Variablen. In jedem Fall können Sie emulieren eine lokale Funktion mit einem lambda-einfach genug.
Statt:
Tun:
Wenn die Aufnahme leer ist, (
[]
) es kann auch umgewandelt werden in eine gewöhnliche Zeiger auf Funktion, genau wie ein echter!Und AFAIK, Lambda-Ausdrücke verwenden können lokale Typen ohne Probleme. Aber, natürlich, öffentliche, statische member-Funktionen in dieser Struktur sollte die Arbeit auch in Ordnung.
Werden kann und als zusätzlicher Hinweis, ein Indirekter Bezug zu Ihrer Frage, was es erlaubt in C++11 wird zum instanziieren einer Vorlage mit einer lokalen Typ (das war verboten, in C++98):
-> int
redundant ist.Gibt es keine lokalen Funktionen in C++11.
Aber es gibt lambdas.
Und Ihre lokalen Typ kann member-Funktionen!
Nein, Sie können nicht dies tun, aber sicher lambdas sind nützlicher, als die rein lokale Funktionen, da Sie können Optional auch das erfassen Zustand? Diese können entweder anonym oder zugewiesen, um eine auto-variable verwendet und in so vielen Orten wie Sie möchten.
Zuvor die anderen Haupt-workaround (insbesondere bei Verwendung der standard-Bibliothek algorithmen) war das definieren eines lokalen Funktor struct mit einem geeigneten operator () - Implementierung. Sie können auch capture-Status mit Hilfe dieser Methode erfordert aber mehr code zu tun. Lambda-Ausdrücke sind eine sehr ordentliche und übersichtliche Weise zu erreichen, die gleiche Sache.
Lokalen Funktionen sind definitiv nicht schwer zu implementieren, Sie waren anwesend, zumindest in 1968 in Pascal, vielleicht sogar noch früher. Sie sind implementiert als C-Erweiterung des GCC.
Übergabe der Adresse einer verschachtelten Funktion ist etwas komplizierter, es in der Regel umfasst die Einrichtung ein Stück code (Trampolin), die ersten setups der statische link/display/was auch immer-Mechanismus wird verwendet, um den Zugriff auf lokale Variablen und führt dann die eigentliche Funktion, code. Das Trampolin befindet sich auf dem stack, was bedeutet, dass der stack muss ausführbar sein, mit den üblichen Auswirkungen auf die Sicherheit von diesem.
Ob das C++ - Komitee hat in Betracht gezogen und verworfen verschachtelte Funktionen, ist Reine Vermutung, aber ich würde vorschlagen, dass, während nicht , dass schwer zu realisieren, die Vorteile von verschachtelten Funktionen sind nicht wirklich der Mühe Wert.
Ist es ziemlich kompliziert, aber Sie können erstellen Sie eine lokale Funktion innerhalb eines lokalen struct-Typ:
Beachten Sie, dass die lokale Funktion keinen Zugriff auf die lokalen Variablen brauchen Sie einen lambda-Ausdruck für, die. Allerdings kann es sinnvoll sein, für die lokale überlastungen: