| Autor |
Nachricht |
lulf
Unregistrierter
|
lulf Unregistrierter
22:08:27 12.04.2012 Titel: |
Lambdas |
Zitieren |
| C++: | 1 2 3 4 5 6 7 8 9 10 | #include <iostream>
auto print = [] (const std::string& s) -> void {
std::cout << s << '\n';
};
int main()
{
print("Hello, Test!");
} | |
Das kompiliert zu meinem Erstaunen fehlerfrei. Lambdas haben also freien Zugriff auf globale Variablen. Warum hat man sich dafür entschieden? |
|
|
|
 |
Unregistrierter
|
Unregistrierter
22:09:47 12.04.2012 Titel: |
Re: Lambdas |
Zitieren |
| lulf schrieb: |
Das kompiliert zu meinem Erstaunen fehlerfrei. Lambdas haben also freien Zugriff auf globale Variablen. Warum hat man sich dafür entschieden? |
Zu meinem nicht, völlig korrekter Code (auch nicht besonders)...
Das ist einer der Konzepte (zugriff auf scope-locals).
Außerdem können normale Funktionen genauso auf globals zugreifen.
P.S.: Das ->void ist da unnötig, da der Rückgabetyp sich ähnlich wie bei PHP automatisch deduzieren lässt... |
Zuletzt bearbeitet von Unregistrierter am 22:12:23 12.04.2012, insgesamt 2-mal bearbeitet |
|
 |
lufl
Unregistrierter
|
lufl Unregistrierter
22:12:34 12.04.2012 Titel: |
Re: Lambdas |
Zitieren |
| Hacker schrieb: | | Zu meinem nicht, völlig korrekter Code (auch nicht besonders)... | Bitte was?
| Hacker schrieb: | | Das ist einer der Konzepte (zugriff auf scope-locals). | Was? Ne, eine Lambda hat normalerweise keinen Zugriff auf Scope-lokale Variablen. (Es sei denn, sie werden gecaptured.)
| Hacker schrieb: | | Außerdem können normale Funktionen genauso auf globals zugreifen. | Ja super, tolles Argument. |
|
|
|
 |
Unregistrierter
|
Unregistrierter
22:14:12 12.04.2012 Titel: |
Re: Lambdas |
Zitieren |
| lufl schrieb: | | Was? Ne, eine Lambda hat normalerweise keinen Zugriff auf Scope-lokale Variablen. (Es sei denn, sie werden gecaptured.) |
Ich meinte, dass das möglich ist, ist ein Konzept (ja, irgendwie zusammenhanglos...)
Du meinst mit gecaptured sicher das '&' in den Index-Klammern.
| C++: | | auto lambda = [&](){std::cout << a << '\n';}; | |
Das mit , da meinte ich dass es mich überhaupt nicht überrascht. |
Zuletzt bearbeitet von Unregistrierter am 22:15:12 12.04.2012, insgesamt 2-mal bearbeitet |
|
 |
Unregistrierter
|
Unregistrierter
22:16:08 12.04.2012 Titel: |
Re: Lambdas |
Zitieren |
| lufl schrieb: |
| Hacker schrieb: | | Außerdem können normale Funktionen genauso auf globals zugreifen. | Ja super, tolles Argument.  |
Wo findest du unterscheiden sich Lambdas und normale Funktionen genau? |
|
|
|
 |
lulf
Unregistrierter
|
lulf Unregistrierter
22:23:35 12.04.2012 Titel: |
|
Zitieren |
lol
Lambdas sind, im Gegensatz zu Funktionen, Objekte. Solange man also nicht per ref captured, haben Lambdas garantiert keine Seiteneffekte. Oder hätten sie nicht, wenn man nicht die globalen Variablen automatisch drin hätte. Was ich absolut nicht nachvollziehen kann. Eigentlich ziemlich großer Quatsch. Jetzt frage ich mich, was sich die Herren dabei gedacht haben. |
|
|
|
 |
Unregistrierter
|
Unregistrierter
22:35:42 12.04.2012 Titel: |
|
Zitieren |
Sieh mal. Erstens: Lambdas ohne andere Funktionen benutzen zu können ist lächerlich (andere Funktionen: sprich: Alle Funktionen aus der STL-Algorithmus Bibliothek, alle Standard-C Funktionen, ..., aber auch Klassen-Methoden). Allerdings weiß man nicht, ob diese vielleicht auch Globals verwenden. Also würde der Seiteneffekt unbewusst impliziert werden, auch wenn mann das Benutzen von Globals "verbieten" würde.
Oder argumentiere ich falsch ?
Also, was ich meine ist, wenn man es syntaktisch verbietet, würde es im Endeffekt keinen Unterschied (außer den blöden Effekt, dass ich Globals eben NICHT VERWENDEN KANN) machen, also jedenfalls keinen positiven. |
Zuletzt bearbeitet von Unregistrierter am 22:40:22 12.04.2012, insgesamt 2-mal bearbeitet |
|
 |
pumuckl
Moderator
Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
|
pumuckl Moderator
09:00:14 13.04.2012 Titel: |
Re: Lambdas |
Zitieren |
Wenn man in Lambdas keinen Zugriff auf globale Variablen hätte (Dass Zugriff auf Funktionen nötig ist, ist hoffentlich klar), könnte man dein Lambda sehr leicht trotzdem implementieren, mit einer Zeile Code:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream>
decltype(std::cout)& getCout() {return std::cout;} //(!)
auto print = [] (const std::string& s) {
getCout() << s << '\n';
};
int main()
{
print("Hello, Test!");
} | |
Und nu? Das kann man für jede globale Variable machen, also kein Gewinn, wenn man den Zugriff verbietet. Also kann mans auch gleich lassen und den Zugriff erlauben. |
_________________ Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
|
|
 |
knivil
Mitglied
Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5851
|
knivil Mitglied
09:10:05 13.04.2012 Titel: |
|
Zitieren |
| Zitat: | | Das kompiliert zu meinem Erstaunen fehlerfrei. Lambdas haben also freien Zugriff auf globale Variablen. Warum hat man sich dafür entschieden? | Warum sollten sich unbenannte Funktionen anders verhalten als benannte/normale?
| Zitat: | | Lambdas sind, im Gegensatz zu Funktionen, Objekte. | Konzept und Umsetzung sind zwei verschiedene Dinge.
| Zitat: | | haben Lambdas garantiert keine Seiteneffekte | Das ist falsch wie du siehst. Sie sollen sich nicht anders als normale Funktionen verhalten.
| Zitat: | | Was ich absolut nicht nachvollziehen kann. Eigentlich ziemlich großer Quatsch. Jetzt frage ich mich, was sich die Herren dabei gedacht haben. | Sie sollen sich eben genauso wie normale Funktionen verhalten. Das halte ich nicht fuer Quatsch sondern fuer konsistent. |
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Zuletzt bearbeitet von knivil am 09:15:27 13.04.2012, insgesamt 1-mal bearbeitet |
|
 |
314159265358979
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
|
314159265358979 Mitglied
12:19:37 13.04.2012 Titel: |
|
Zitieren |
Die Standard-Lambdas sind doch eh Müll, meine Lambda-Lib ist viel besser. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|