C++11 lambda 表达式末尾的括号
Parentheses at the end of a C++11 lambda expression
我对我遇到的一些C++11 lambdas的例子感到困惑。例如:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << []()->string{return "Hello World 1!";}() << endl;
[]{cout << "Hello World 2!" << endl;}();
string result = [](const string& str)->string {return "Hello World " + str;}("2!");
cout << "Result: " << result << endl;
result = [](const string& str){return "Hello World " + str;}("3!");
cout << "Result: " << result << endl;
string s;
[&s](){s = "Hello World 4!";}; // does not work
cout << s << endl;
[&s](){s = "Hello World 4!";}(); // works!
cout << s << endl;
return 0;
}
我无法弄清楚末尾的括号在做什么。它们是否作为构造函数实例化 lambda?给定 lambda 的模板是:
[capture_block](parameters) mutable exception_specification -> return_type {body}
令我困惑的是,这些实例需要这些括号才能工作。有人可以解释为什么需要它们吗?
好吧,鉴于lambda表达式基本上是一个匿名函数,末尾的括号只做调用这个函数。所以
result = [](const string& str){return "Hello World " + str;}("3!");
正好相当于
auto lambda = [](const string& str){return "Hello World " + str;};
string result = lambda("3!");
这与没有参数的 lambda 相同,例如
cout << []()->string{return "Hello World 1!";}() << endl;
否则(如果未调用)将尝试输出 lambda 表达式,这本身不起作用。通过调用它,它只是发出结果std::string
。
他们正在调用函数对象!
分两个阶段:
auto l = []()->string{return "Hello World 1!";}; // make a named object
l(); // call it
lambda 表达式的计算结果为函数对象。由于没有采用此类函数对象的operator<<
重载,因此如果不调用它来生成std::string
,则会出现错误。
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式
- C++ Lambda 表达式:通过 ref 开销捕获
- Qt 连接无法识别 lambda 表达式