Maison >développement back-end >C++ >Comment le cycle de vie et la portée des expressions lambda dans les fonctions C++ sont-ils gérés ?
L'expression lambda a un cycle fonctionnel et une gestion de portée uniques en C++ : Cycle de vie : le cycle de vie de l'expression lambda est lié à la durée de vie de la variable capturée, et la lambda expire également lorsque la variable est détruite. Portée : un lambda ne peut accéder qu'aux variables contenues dans sa portée de définition, y compris les variables locales, les variables globales et les variables externes capturées par référence ou pointeur. Cas pratiques : les expressions lambda sont largement utilisées dans le traitement d'événements, les algorithmes de tri, le traitement de données et d'autres scénarios.
Les expressions Lambda sont de puissantes fonctions anonymes en C++. Leur durée de vie et leur portée sont différentes de celles des fonctions ordinaires, et comprendre ces différences est essentiel pour utiliser efficacement les expressions lambda.
La durée de vie d'une expression lambda est liée à la durée de vie de la variable capturée. Les variables capturées par les expressions lambda sont détruites lorsqu'elles quittent la portée dans laquelle elles ont été définies. Par exemple :
int main() { int x = 10; auto lambda = [x] { return x; // 捕获了 x }; //... 这里 lambda 表达式仍然有效 x = 20; // 修改 x //... lambda 表达式不再有效,因为 x 已经销毁 }
La portée d'une expression lambda est régie par des règles de fermeture. Une fermeture est une fonction ou une expression lambda qui possède une copie d'une variable définie dans sa portée externe. Une expression lambda ne peut accéder qu'aux variables dans le périmètre dans lequel elle est définie, notamment :
Les exemples suivants illustrent la portée des expressions lambda :
int y = 20; int main() { auto lambda = [y]() { return y; // 只能访问 y }; //... 这里 lambda 表达式仍然有效 int y = 30; // 创建新的局部变量 y auto result = lambda(); // 返回 20,外部作用域的 y }
Les expressions lambda peuvent être utilisées efficacement dans une variété de scénarios :
std::sort(arr.begin(), arr.end(), [](int a, int b) { return a <b; })
. std::sort(arr.begin(), arr.end(), [](int a, int b) { return a < b; })
。std::transform(vec.begin(), vec.end(), vec.begin(), [](int x) { return x * 2; })
std::transform(vec.begin(), vec.end(), vec.begin(), [ ]( int x) { return x * 2; })
. 🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!