return 在函数的 lambda 表达式的 return 值中有什么意义?
What is the significance of returning the return value of a lambda expression from a function?
自 C++17 起 it is possible 在 constexpr
函数中使用 lambda 表达式。
在相关文档中 Wording for constexpr lambda 显示了此代码示例:
constexpr int AddEleven(int n) {
return [n] { return n + 11; }();
}
这只是一个演示语言功能的玩具示例,还是在实际用例中此代码的行为与以下代码不同?
constexpr int AddEleven(int n) {
return n + 11;
}
在这种情况下使用 lambda 表达式有什么好处?
This code demonstrates a feature of c++ that a lamda can be made constexpr. Which is not possible before c++17.
This code will not work before c++17.
#include <iostream>
constexpr int Increment(int value) {
return [value] { return value + 1; }();
};
int main()
{
Increment(10);
static_assert(11 == Increment(10), "Increment does not work correctly");
return 0;
}
What would be the benefit of using a lambda expression in this case?
没有任何好处。
它的作用简单明了,目的是作为有效代码的示例。以几乎相同的方式 no-one 需要一个将“Hello World”输出到控制台的程序,但在示例代码中有数百种用途。
Immediately-invoked lambda 可用于在表达式中提供 statement-friendly 范围,通常以比构造函数参数允许的更复杂的方式初始化 const
变量:
auto const v = [&] {
std::vector<int> v;
// do some stuff
for(/*...*/)
v.push_back(/*...*/);
return v;
}();
A return
语句必须已经出现在一个范围内,因此将它与上述模式结合起来并没有太大的好处。但是我可以想象它曾经用来阐明需要这样的初始化的 early-out 条件:
if(/* some corner case */)
return [&] {
std::vector<int> v;
// do some stuff
for(/*...*/)
v.push_back(/*...*/);
return v;
}();
...相比于:
if(/* some corner case */) {
std::vector<int> v;
// do some stuff
for(/*...*/)
v.push_back(/*...*/);
return v;
}
...其中 return
离条件更远。
自 C++17 起 it is possible 在 constexpr
函数中使用 lambda 表达式。
在相关文档中 Wording for constexpr lambda 显示了此代码示例:
constexpr int AddEleven(int n) { return [n] { return n + 11; }(); }
这只是一个演示语言功能的玩具示例,还是在实际用例中此代码的行为与以下代码不同?
constexpr int AddEleven(int n) {
return n + 11;
}
在这种情况下使用 lambda 表达式有什么好处?
This code demonstrates a feature of c++ that a lamda can be made constexpr. Which is not possible before c++17.
This code will not work before c++17.
#include <iostream>
constexpr int Increment(int value) {
return [value] { return value + 1; }();
};
int main()
{
Increment(10);
static_assert(11 == Increment(10), "Increment does not work correctly");
return 0;
}
What would be the benefit of using a lambda expression in this case?
没有任何好处。
它的作用简单明了,目的是作为有效代码的示例。以几乎相同的方式 no-one 需要一个将“Hello World”输出到控制台的程序,但在示例代码中有数百种用途。
Immediately-invoked lambda 可用于在表达式中提供 statement-friendly 范围,通常以比构造函数参数允许的更复杂的方式初始化 const
变量:
auto const v = [&] {
std::vector<int> v;
// do some stuff
for(/*...*/)
v.push_back(/*...*/);
return v;
}();
A return
语句必须已经出现在一个范围内,因此将它与上述模式结合起来并没有太大的好处。但是我可以想象它曾经用来阐明需要这样的初始化的 early-out 条件:
if(/* some corner case */)
return [&] {
std::vector<int> v;
// do some stuff
for(/*...*/)
v.push_back(/*...*/);
return v;
}();
...相比于:
if(/* some corner case */) {
std::vector<int> v;
// do some stuff
for(/*...*/)
v.push_back(/*...*/);
return v;
}
...其中 return
离条件更远。