这个代码块 [=,&i]()可变 {}()是什么意思?

What is the meaning is this code block [=,&i]()mutable {}()?

本文关键字:可变 意思 是什么 代码      更新时间:2023-10-16

我正在做一个c++测试,下面有一个奇怪的代码块,我不理解。这里,iint, codechar:

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

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

这段代码是什么意思?

这是一个lambda函数,是2011年添加到语言中的一个特性。

  • =意味着外部变量的副本在内部可用。
  • &i意味着,尽管有上述情况,i实际上是可参考的。
  • mutable关键字允许在函数体内部修改code副本。
  • 后面的()在函数声明后立即"运行"函数。
如前所述,我看不出有什么特别的理由使用lambda。看来某人的目的达到了:迷惑你。

我试着一点一点地解释,因为代码可能会让人困惑,表达式是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() {};
所以你可以把变成这样的
[](int a) {...}(12); 

这将调用带参数12的lambda。

括号中的部分通常是函数体。大括号关闭后,创建lambda。因此,您可以将包括大括号及其之前的所有内容视为lambda构造函数的一部分。然后,最后一对括号像调用其他函数一样简单地调用lambda。

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

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

参考http://en.cppreference.com/w/cpp/language/lambdahttp://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;
}

这是一个lambda函数,通过复制捕获所有内容(=位),并通过引用显式捕获i变量(&i位),然后lambda在声明后直接被赋值。

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