C++11 lambda 表达式末尾的括号

Parentheses at the end of a C++11 lambda expression

本文关键字:lambda 表达式 C++11      更新时间:2023-10-16

我对我遇到的一些C++11 lambdas的例子感到困惑。例如:

#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;
}

我无法弄清楚末尾的括号在做什么。它们是否作为构造函数实例化 lambda?给定 lambda 的模板是:

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

令我困惑的是,这些实例需要这些括号才能工作。有人可以解释为什么需要它们吗?

好吧,鉴于lambda表达式基本上是一个匿名函数,末尾的括号只做调用这个函数。所以

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

正好相当于

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

这与没有参数的 lambda 相同,例如

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

否则(如果未调用)将尝试输出 lambda 表达式,这本身不起作用。通过调用它,它只是发出结果std::string

他们正在调用函数对象!

分两个阶段:

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

lambda 表达式的计算结果为函数对象。由于没有采用此类函数对象的operator<<重载,因此如果不调用它来生成std::string,则会出现错误。