我正在进行c ++测试,下面有一个奇怪的代码块,我不明白。在此,i
为int
,code
为char
:
[=,&i]()mutable
{
i++;
code = 'b';
std::cout << "i:" <<i<<"""code:"<<code <<cout::endl;
}();
我不知道如何解释这个;它看起来不像典型的C ++代码块。我在网上搜索了有关此内容的信息,但在这种代码风格上找不到任何其他内容。
这段代码是什么意思?
答案 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(及更高版本)代码。