O que significa [=] em C ++?

93

Eu quero saber o que [=]faz? Aqui está um pequeno exemplo

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);

Como o código funcionaria em []vez de [=]?

Eu assumo isso

std::function<T (T)>

significa um protótipo de função que obtém (T)como argumento e tipo de retorno T?

der_lord
fonte
4
Isso é bizarramente bem votado para algo que parece fazer três perguntas diferentes não pesquisadas e é uma duplicata de O que é uma expressão lambda em C ++ 11?
underscore_d
Concordo com @underscore_d - Parece que algum clique está aumentando a classificação, certo? :)
BitTickler

Respostas:

108

O que [=]você está se referindo faz parte da lista de captura para a expressão lambda. Isso informa ao C ++ que o código dentro da expressão lambda é inicializado para que o lambda obtenha uma cópia de todas as variáveis ​​locais que usa quando é criado. Isso é necessário para que a expressão lambda possa se referir a factore offset, que são variáveis ​​locais dentro da função.

Se você substituir o [=]com [], você poderá obter um erro do compilador porque o código dentro da expressão lambda não vai saber o que as variáveis offsete factorse referem. Muitos compiladores fornecem boas mensagens de erro de diagnóstico se você fizer isso, então tente e veja o que acontece!

templatetypedef
fonte
13
"Isso é necessário" - essa opção exata não é necessária; também poderíamos escrever [&], [=offset, =input]etc.
MM
1
@MM - Isso não captura referências a locais?
Inútil
5
@MM Usar uma captura de referência aqui seria um problema porque as vidas úteis dessas variáveis ​​locais terminarão assim que o lambda for retornado. Você está certo de que poderíamos listar as variáveis ​​individuais individualmente.
templatetypedef
45

É uma lista de captura de lambda . Disponibiliza variáveis ​​para o lambda. Você pode usar [=]quais cópias por valor ou [&]quais passam por referência.

kometen
fonte
3
Você também pode usar o []que não captura nada. :)
Daniel Kamil Kozar