Cosa significa [=] in C ++?


93

Voglio sapere cosa [=]fa? Ecco un breve esempio

template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
    return [=] (T input) -> T { return (offset + input) * factor; };
}

auto milesToKm = makeConverter(1.60936, 0.0);

Come funzionerebbe il codice []invece di [=]?

presumo che

std::function<T (T)>

significa un prototipo di funzione che ottiene (T)come argomento e tipo di ritorno T?


4
Questo è stranamente altamente votato per qualcosa che sembra porre 3 diverse domande non ricercate ed è un duplicato di Che cos'è un'espressione lambda in C ++ 11?
underscore_d

Sono d'accordo con @underscore_d - Sembra che qualche clic stia aumentando la valutazione, giusto? :)
BitTickler

Risposte:


108

L'oggetto a [=]cui ti riferisci fa parte dell'elenco di acquisizione per l'espressione lambda. Questo dice a C ++ che il codice all'interno dell'espressione lambda è inizializzato in modo che lambda ottenga una copia di tutte le variabili locali che usa quando viene creato. Ciò è necessario affinché l'espressione lambda possa fare riferimento a factore offset, che sono variabili locali all'interno della funzione.

Se si sostituisce il [=]con [], si otterrà un errore di compilazione perché il codice all'interno della espressione lambda non saprà quali sono le variabili offsete factorsi riferiscono a. Molti compilatori danno buoni messaggi di errore diagnostico se lo fai, quindi provalo e guarda cosa succede!


13
"Questo è necessario": questa opzione esatta non è necessaria; potremmo anche scrivere [&], [=offset, =input]ecc.
MM

1
@MM - Non cattura riferimenti alla gente del posto?
Inutile

5
@MM L'utilizzo di un'acquisizione di riferimento qui sarebbe un problema perché la durata di tali variabili locali terminerà non appena viene restituito il lambda. Hai ragione sul fatto che potremmo elencare le singole variabili individualmente, però.
templatetypedef

45

È un elenco di acquisizione lambda . Rende disponibili le variabili per lambda. Puoi usare [=]quale copia per valore o [&]quale passa per riferimento.


3
Puoi anche usare []che non cattura nulla. :)
Daniel Kamil Kozar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.