2015-10-23 9 views
9

I lambda di C++ sarebbero convenienti da usare in modelli che necessitano di oggetti funzione ma, ahimè, non possono essere costruiti in modo predefinito.Esiste un motivo per cui lambda con una lista di acquisizione vuota non può essere costruita in modo predefinito?

Come discusso in questa domanda, questo ha senso per lambda che hanno una lista di cattura non vuota.

Instantiating C++ lambda by its type

Kerrek spiega:

Il codice non ha senso. Immaginate di avere una lambda cattura come questo:

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

Che cosa potrebbe significare per difetto-costruire un oggetto di tipo decltype (t)?

E i lambda con una lista di cattura vuota? C'è una ragione per cui anche quelli non hanno senso per il costrutto predefinito? C'è qualcosa di più rispetto a "lo standard dice così"?

+0

Come predefinire costruire un tipo non specificato? E perché vorresti farlo quando puoi assegnare un lambda a 'std :: function'? – 101010

+2

@ 101010 Il tipo è 'decltype (t)' nell'esempio. Un lambda è preferibile a 'std :: function' perché' std :: function' introduce in questo caso l'indirezione non necessaria (non c'è dubbio su quale funzione vogliamo e non cambieremo idea più avanti), più la definizione lambda può essere posizionato esattamente dove è usato – Praxeolitic

risposta

4

In generale, lambda dove specificato il meno possibile per risolvere casi d'uso specifici.

Altre possibili cose utili, come "un lambda che copia solo i dati banalmente copiabili devono essere banalmente copiabili" è stato anche omesso. (Lo standard non specifica se un lambda è banalmente copiabile o meno)

Il vantaggio è che rende lambda una funzionalità più facile da implementare, che è importante. Il rovescio della medaglia è che questo esclude certi usi che non sono nel set "previsto".

Se pensi che "un lambda privo di catture deve avere un costruttore di argomenti zero" è una cosa importante, proponilo. Ma questo richiede un uso di lambda (facile acquisizione locale e creazione di oggetti funzione) e lo trasforma in qualcos'altro (facile creazione di oggetti funzione senza stato i cui tipi possono essere passati in giro).

+0

Sono state accettate proposte da persone che non sono coinvolte nel comitato o noti guru del C++? – Praxeolitic

+0

@Praxeolitic, per avere qualche lieve cambiamento di accettazione deve essere accompagnato dall'implementazione. – SergeyA

+1

@SergeyA Ovviamente è falso se la proposta è ben strutturata e ha sia una sezione di motivazione persuasiva che una buona formulazione. L'implementazione esistente solleva il cambiamento di accettazione in una certa misura ma non è necessario (e certamente non compensa aspetti più importanti del tuo lavoro). – Columbo

Problemi correlati