Круглые скобки в конце лямбда-выражения C ++ 11

Меня смущают некоторые примеры, которые я встречал с лямбдами C ++ 11.
Например:

#include <iostream>
#include <string>

using namespace std;

int main()
{
cout << []()->string{return "Hello World 1!";}() << endl;

[]{cout << "Hello World 2!" << endl;}();

string result = [](const string& str)->string {return "Hello World " + str;}("2!");
cout << "Result: " << result << endl;

result = [](const string& str){return "Hello World " + str;}("3!");
cout << "Result: " << result << endl;

string s;
[&s](){s = "Hello World 4!";};   // does not work
cout << s << endl;
[&s](){s = "Hello World 4!";}(); // works!
cout << s << endl;

return 0;
}

Я не могу понять, что делают круглые скобки в конце. Являются ли они конструктором лямбды? Учитывая, что шаблон для лямбды это:

[capture_block](parameters) mutable exception_specification -> return_type {body}

это сбивает с толку, что эти скобки необходимы для работы этих экземпляров. Может кто-нибудь объяснить, что они, зачем они нужны?

3

Решение

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

result = [](const string& str){return "Hello World " + str;}("3!");

просто эквивалентно

auto lambda = [](const string& str){return "Hello World " + str;};
string result = lambda("3!");

То же самое относится к лямбде без аргументов, как в

cout << []()->string{return "Hello World 1!";}() << endl;

который в противном случае (если не вызывается) пытается вывести лямбда-выражение, которое само по себе не работает. Называя это просто выдает std::string,

8

Другие решения

Они вызывают объект функции!

В два этапа:

auto l = []()->string{return "Hello World 1!";}; // make a named object
l(); // call it

Лямбда-выражение оценивается как функциональный объект. Так как нет operator<< перегрузка, которая принимает такой объект функции, вы получите сообщение об ошибке, если вы не вызовете его для создания std::string,

6

По вопросам рекламы [email protected]