我正在参加一项C++测试,下面有一个奇怪的代码块,我不理解。在这里,i
是一个int
,code
是一个char
:
[=,&i]()mutable
{
i++;
code = 'b';
std::cout << "i:" <<i<<"""code:"<<code <<cout::endl;
}();
我不知道如何解释这段代码,它看起来并不像典型的C++代码块。我已经在网上搜索了相关信息,但没有找到其他类似的代码风格。
这段代码是什么意思?
这是一个lambda函数,是2011年添加到该语言中的一项功能。
=
表示外部变量的副本在内部可用。&i
表示尽管如上所述,特别是i实际上是按引用可用的。mutable
关键字允许在函数体内修改code
副本。()
在声明后立即“运行”函数。按照现有的写法,我看不出使用lambda的特定原因。看起来有人已经成功地达到了他们的目标:让你感到困惑。
mutable
lambda的知识,多亏了你:) 我以前不知道在这种情况下需要使用这个关键字。再说一遍,除了在SO上,我实际上并没有进行任何C++11开发... - Lightness Races in Orbit我将逐步解释这部分内容,因为原始代码可能会令人困惑,表达式是一个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;
}
[=,&i]
的含义。()
是一个常规的函数参数表达式,类似于以下括号。void function() {};
[](int a) {...}(12);
这将使用参数12
调用lambda函数。
大括号中的部分通常是函数体。当花括号关闭时,lambda函数就被创建了。因此,您可以认为包括和在内的所有内容都是lambda函数的构造函数的一部分。然后,最后一对括号就像任何其他函数一样调用lambda函数。
我没有提到的另一件事是mutable
关键字。默认情况下,假设lambda函数不能更改其成员变量的值。您需要向lambda函数添加可变性,以传达给编译器它将修改其成员变量。
您可能需要在其他地方学习lambda函数。
一些参考资料: http://en.cppreference.com/w/cpp/language/lambda http://www.cprogramming.com/c++11/c++11-lambda-closures.html
当我最初尝试理解lambda函数时,我阅读了第二个链接,但现在每次我对lambda函数的语法有疑问时都会去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;
}
这是一个通过拷贝(等号=
)捕获所有内容并显式引用变量i
(取地址符&i
)的lambda函数,然后在声明它后立即调用。
如果这看起来不像典型的C++代码,那么您可能落后于游戏几年,因为这是完全合法的C++11 / 14(及更高版本)代码。
mutable
关键字的非典型lambda定义。能否请您提供更多上下文信息? - πάντα ῥεῖ