7

我对使用 C++11 lambda 时遇到的一些示例感到困惑。例如:

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

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

4

2 回答 2

10

好吧,鉴于 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

于 2012-09-30T16:05:11.907 回答
7

他们正在调用函数对象!

分两个阶段:

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

一个 lambda 表达式的计算结果是一个函数对象。由于没有operator<<采用这样一个函数对象的重载,因此如果您没有调用它来生成一个std::string.

于 2012-09-30T16:05:23.657 回答