这段代码是什么意思[=,& i]()mutable {}()?

时间:2016-07-01 17:27:43

标签: c++ lambda

我正在进行c ++测试,下面有一个奇怪的代码块,我不明白。在此,iintcodechar

[=,&i]()mutable
{
  i++;
  code = 'b';
  std::cout << "i:" <<i<<"""code:"<<code <<cout::endl;
}();

我不知道如何解释这个;它看起来不像典型的C ++代码块。我在网上搜索了有关此内容的信息,但在这种代码风格上找不到任何其他内容。

这段代码是什么意思?

3 个答案:

答案 0 :(得分:7)

这是lambda function ,这是2011年语言中添加的一项功能。

  • =表示来自外部的变量副本可在内部使用。
  • &i表示尽管如此,i实际上可以通过引用获得。
  • mutable关键字允许在函数体内修改code副本。
  • 尾随()&#34;运行&#34;声明后立即执行的功能。

如上所述,我无法看到使用lambda的任何特殊原因。看起来有人成功实现了他们的目标:迷惑你。

答案 1 :(得分:2)

我会尝试一点一点地解释这一点,因为代码原样可能令人困惑,the expression is a lambda,我不会谈论它,但你可以把它想象成一个内联定义的函子。尝试并运行以下代码开始,

#include <iostream>
using namespace std;

int main() {
    auto function_object = []() {
        cout << "This is a lambda" << endl;
    };
    function_object(); // This will print the above

    return 0;
}

您的问题中的lambda通过引用具有成员变量i,并且lambda中函数体中引用的所有其他内容都是按值从外部范围获取的。这就是[=, &i]的含义。

下面的()是一个常规函数参数表达式,类似于下面的括号

void function() {};

所以你可以把lambda改成像这样的东西

[](int a) {...}(12); 

这将使用参数12调用lambda。

大括号中的部分像往常一样是函数体。大括号关闭后,会创建lambda。所以你可以考虑包括和在花括号之前的所有内容,作为lambda构造函数的一部分。然后最后一对括号只是像任何其他函数一样调用lambda。

我没有提到的另一件事是mutable关键字。默认情况下,Lambdas无法更改其成员变量的值。您需要将mutable添加到lambda以向编译器传达它将修改其成员变量。

你可能需要在其他地方阅读lambda。

一些参考资料 http://en.cppreference.com/w/cpp/language/lambda http://www.cprogramming.com/c++11/c++11-lambda-closures.html

当我最初尝试理解lambdas时,我读了第二个链接,但现在每次我对lambdas的语法有疑问时我都会进行cppreference!

尝试编译并运行以下代码。这些是可以帮助您更好地理解代码的一些示例。

#include <iostream>
using namespace std;

int main() {
    []() {
        cout << "This is a lambda :)" << endl;
    }();

    auto func = []() {
        cout << "This is another lambda that is stored as a functor in a variable" << endl;
    };
    func();

    int a{10};
    [=]() mutable {
        cout << "I have captured the value of a from the surrounding scope by value " << a << endl;
        a = 20;
    }();

    [&a]() { // notice mutable is not here
        cout << "Here a is captured by reference " << a << endl;
        a = 100;
    }();
    cout << a << endl; // outputs 100

    return 0;
}

答案 2 :(得分:0)

这是一个lambda函数,通过复制(=位)捕获所有内容,并通过引用显式引用i变量(&i位),然后在声明后对lambda进行直接调整它

如果这对你来说看起来不像典型的C ++那么你就落后了几年,因为这是完美的C ++ 11/14(及更高版本)代码。