这个代码块 [=,&i]()可变 {}()是什么意思?
What is the meaning is this code block [=,&i]()mutable {}()?
我正在做一个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,我不会讲太多,但你可以把它看作是内联定义的函子。尝试运行以下代码来启动
#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(以及更高版本)代码。
- 具有重复类型的C++可变模板
- c++:可变模板和函数重载
- 正在寻找C++不可变的hashset/hashmap
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 将结构字段的类型展开为可变模板参数
- 使用可变模板的Broadcaster/Listener模式
- 对可变参数使用声明.如何选择正确的功能
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- '尝试解析可变参数模板时无法推断出'T的模板参数
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 错误:无效的预处理指令 #i 的意思是 #if?
- 如何在c ++中存储可变参数模板参数?
- 扩展可变参数模板中的变量名称
- 如何将可变长度参数联接为字符串
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- C++中的可变长度数组/数据结构
- 这个代码块 [=,&i]()可变 {}()是什么意思?