captura referências em c 11 lambdas
em c, as expressões lambda podem capturar variáveis de seu scope. No entanto, o método de captura determina se a variável é acessada por referência ou por valor. Considere o seguinte código:
#include
#include
std::function make_function(int& x) {
return [&]{ std::cout este código captura a variável x por referência usando a sintaxe [&]. Surge a pergunta se este programa garante a saída 5 sem invocar comportamento indefinido. Antes de examinar a redação padrão subjacente, é importante observar que esse código funciona como pretendido pelo Comitê C. No entanto, a redação inicial do padrão C 11 não foi clara sobre esse assunto, levando a edição do CWG 2011 para fornecer esclarecimentos. Esta questão está sendo abordada no desenvolvimento contínuo do padrão C. Expressões de ID referentes a entidades capturadas por referência são deixadas sozinhas e continuam a denotar a mesma entidade que eles teriam denotado no escopo fechado. Portanto, a referência x na expressão lambda refere -se à variável original declarada na função principal.
pode inicialmente parecer problemático que X está sendo referenciado fora de sua vida útil após o retorno da função Make_função. No entanto, existem cenários limitados nos quais uma referência pode ser referenciada fora de sua vida. Geralmente, uma referência é declarada em escopo ou é um membro da classe; nesse caso, a própria classe deve estar durante a vida útil. Essa brecha permitiu a captura de referências por referência nas expressões lambda a serem suportadas. A resolução dessa questão afetou inadvertidamente a especificação para a captura de lambda por referência de referências. No entanto, espera -se que essa regressão seja corrigida antes da liberação de C 17.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3