Captura de < c ++ > lambda 的

Este artículo se refiere a las notas de la conferencia del profesor Hou Jie sobre "C ++ Standard 11-14".

La diferencia entre captura por valor y por referencia

#include <iostream>
using namespace std;

int main()
{
    
    
    int id = 0;
    auto f = [id] () mutable {
    
    
        cout << "id: " << id << endl;
        ++id;
    };    
    id = 42;
    f();
    f();
    f();
    cout << id << endl;
	return 0;
}

Resultados de la

id: 0
id: 1
id: 2
42
#include <iostream>
using namespace std;

int main()
{
    
    
    int id = 0;
    auto f = [&id] () mutable {
    
    
        cout << "id: " << id << endl;
        ++id;
    };    
    id = 42;
    f();
    f();
    f();
    cout << id << endl;
	return 0;
}

Resultados de la

id: 42
id: 43
id: 44
45

Captura y variables estáticas externas

  1. La variable estática externa debe aparecer antes de la expresión lambda antes de que pueda usarse dentro de la expresión lambda.
  2. Las variables internas de Lambda no se pueden utilizar en áreas externas.
#include <iostream>
using namespace std;

int main()
{
    
    
    static int id = 5;
    // 外部静态变量要先于lambda表达式出现,才能在lambda表达式内部使用。
    auto f = [] () mutable {
    
    
        cout << "id: " << id++ << endl;
        static int id2 = 10;
        cout << "id2: " << id2++ << endl;
    };   
    id = 42;
    f();
    f();
    f();
    cout << id << endl;
    // cout << "id2: " << id2 << endl; 
    // 编译不通过,error: 'id2' was not declared in this scope; did you mean 'id'?
	return 0;
}

Resultados del:

id: 42
id2: 10
id: 43
id2: 11
id: 44
id2: 12
45

captura lambda 的

  1. [=] significa que el alcance externo se pasa a la lambda por valor.
  2. [&] significa que el alcance externo se pasa al lambda por referencia.

Ej:
int x = 0;
int y = 42;
auto qqq = [x, & y] {…};
[=, & y] para pasar y por referencia y todos los demás objetos por valor.

Supongo que te gusta

Origin blog.csdn.net/gyhwind/article/details/115278773
Recomendado
Clasificación