2015-10-23 12 views
9

C++ 's Lambdas wäre bequem in Vorlagen zu verwenden, die Funktionsobjekte benötigen, aber leider können sie nicht standardmäßig erstellt werden.Gibt es einen Grund, warum Lambdas mit einer leeren Capture-Liste nicht standardmäßig erstellt werden können?

Wie in dieser Frage diskutiert, ist dies für Lambdas sinnvoll, die eine nicht leere Capture-Liste haben.

Instantiating C++ lambda by its type

Kerrek erklärt:

Der Code macht keinen Sinn. Stellen Sie sich einen Fang Lambda haben wie dies:

{ 
    int n = 0; 
    auto t = [&n](int a) -> int { return n += a; }; 
} 

Was könnte es bedeuten, möglicherweise auf die Standard-Konstrukt ein Objekt vom Typ decltype (t)?

Was ist mit Lambdas mit einer leeren Capture-Liste? Gibt es einen Grund, warum diese auch keinen Sinn machen, um einen Default zu konstruieren? Gibt es mehr als "der Standard sagt so"?

+0

Wie standardkonstruieren Sie einen Typ, der nicht angegeben ist? Und warum sollten Sie das tun, wenn Sie einer 'std :: -Funktion ein Lambda zuweisen können? – 101010

+2

@ 101010 Der Typ ist 'declltype (t)' im Beispiel. Ein Lambda ist der 'std :: function' vorzuziehen, weil' std :: function' in diesem Fall eine unnötige Indirection einführt (es gibt keine Frage darüber, welche Funktion wir wollen und wir werden unsere Meinung später nicht ändern) plus die Lambda-Definition genau dort platziert werden, wo es gebraucht wird. – Praxeolitic

Antwort

4

Im Allgemeinen wurden Lambdas so wenig wie möglich spezifiziert, um spezifische Anwendungsfälle zu lösen.

Andere möglicherweise nützliche Dinge, wie "ein Lambda, das nur trivial kopierbare Daten kopiert, müssen einfach kopierbar sein" wurde ebenfalls weggelassen. (Der Standard legt nicht fest, ob ein Lambda trivial kopierbar ist oder nicht).

Die Oberseite ist, dass es Lambda eine leichter zu implementierende Funktion macht, was wichtig ist. Der Nachteil ist, dass dadurch bestimmte Verwendungen ausgeschlossen werden, die nicht im "beabsichtigten" Set sind.

Wenn Sie denken, dass "ein Capture-freies Lambda muss einen Null-Argument-Konstruktor haben" ist eine wichtige Sache, schlagen Sie es vor. Dies erfordert jedoch die Verwendung von Lambdas (einfache lokale Erfassung und Erstellung von Funktionsobjekten) und verwandelt sie in etwas anderes (einfache Erstellung von zustandslosen Funktionsobjekten, deren Typen weitergegeben werden können).

+0

Wurden Vorschläge von Leuten angenommen, die nicht mit dem Komitee oder bekannten C++ Gurus beschäftigt sind? – Praxeolitic

+0

@Praxeolitic, um eine geringfügige Änderung der Akzeptanz zu haben, muss es von der Implementierung begleitet werden. – SergeyA

+1

@SergeyA Das ist offensichtlich falsch, wenn der Vorschlag gut strukturiert ist und sowohl einen überzeugenden Motivationsabschnitt als auch eine solide Formulierung hat. Bestehende Implementierung erhöht die Akzeptanz der Akzeptanz in gewissem Maße, ist aber nicht notwendig (und sicherlich nicht für wichtigere Merkmale Ihres Papiers kompensieren). – Columbo

Verwandte Themen