Что означает аргумент []() в функции?

Я работаю в библиотеке ESP8266 AsyncWebserver и использую этот [](параметр) в качестве аргумента для некоторых функций, как показано ниже, но на самом деле не знаю, что это значит. Будучи новичком, мне любопытно узнать, что означает это соглашение, его функциональные возможности и как его использовать. Надеюсь, здешние специалисты помогут мне в этом.

server.on("/page",HTTP_GET,[](AsyncWebServerRequest * request){
    some code....;
    request->getParam("Param1")->value();
});

, 👍4


1 ответ


Лучший ответ:

6

Это называется лямбда-выражение и позволяет включить содержимое функции как параметр анонимно вместо того, чтобы писать реальную функцию и использовать ее имя.

Это сокращение от:

void myCallback(AsyncWebServerRequest * request) {
    // какой-то код....;
    request->getParam("Param1")->value();
}

// ...

server.on("/page", HTTP_GET, myCallback);

У него есть несколько преимуществ по сравнению с традиционными функциями за счет удобочитаемости, например возможность "захватывать" локальные переменные из окружающей области.

,

Спасибо, Mr.@Majenko, я поищу эту тему дальше. Таким образом, в приведенном выше примере вместо создания новой функции в качестве обратного вызова они использовали лямбда-функцию на ходу для локального использования в самой области действия функции. Я прав. Мне просто любопытно узнать, можем ли мы использовать переменные, объявленные в функции server.on, внутри лямбда-выражения., @Mr.B

Все разъяснено по ссылке. Но любая переменная, определенная внутри функции, в которой появляется server.on, может быть "захвачена", поместив ее между [...], чтобы затем вы могли использовать ее из самого лямбда-выражения., @Majenko

Спасибо, мистер @Majenko, это полезно, @Mr.B

В более общем смысле, лямбда на самом деле является сокращением для объявления класса где-то в охватывающей его области видимости, struct unnamed_lambda_helper { /* захваченные локальные переменные являются членами данных этого класса */ auto operator()(/* здесь аргументы */) -> /* здесь возвращаемый тип, если он указан */ { /* здесь тело */ } };, а затем выражение создает экземпляр этого класса., @HTNW

Это только С++?, @Peter Mortensen

@PeterMortensen Это функция С++ 11 (это означает, что старые компиляторы могут ее не поддерживать). Конечно, в других языках есть своя версия этого. Насколько мне известно, C не поддерживает., @Cort Ammon

Спасибо @CortAmmon, @Mr.B