本文主要是介绍C++20中lambda表达式新增加支持的features,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.弃用通过[=]隐式捕获this,应使用[=,this]或[=,*this]显示捕获:
namespace {
struct Foo {int x{ 1 };void print(){//auto change1 = [=] { // badauto change1 = [=, this] { // good, this: referencethis->x = 11;};change1();std::cout << "x: " << x << std::endl; // x: 11auto change2 = [=, *this] { // *this: value//this->x = 22; // error C3490: 由于正在通过常量对象访问"x",因此无法对其进行修改auto m = this->x;std::cout << "x: " << x << std::endl; // x: 11};change2();}
};} // namesapceint test_lambda_20_this()
{Foo foo;std::cout << "x: " << foo.x << std::endl; // x: 1foo.print();std::cout << "x: " << foo.x << std::endl; // x: 11return 0;
}
执行结果如下图所示:
2.lambda表达式中支持使用模板语法:
int test_lambda_20_template()
{auto func = []<typename T>(const T& x, const T& y) {return (x + y);};std::cout << "value: " << func(1, 2) << std::endl; // value: 3std::cout << "value: " << func(std::string{ "hello " }, std::string{ "world" }) << std::endl; // value: hello worldreturn 0;
}
3.lambda中支持参数包(parameter pack):包括按值捕获参数包和按引用捕获参数包
namespace {
template <typename... Args>
auto func1(Args&&... args)
{return [...args = std::forward<Args>(args)] { // by value// ...};
}template <typename... Args>
auto func2(Args&&... args) {return [&...args = std::forward<Args>(args)] { // by reference// ...};
}} // namesapceint test_lambda_20_parameter_pack()
{auto print = [](auto&&... args) {((std::cout << args << ' '), ...);std::cout << std::endl;};print(6, 8, "hello, world");return 0;
}
GitHub:https://github.com/fengbingchun/Messy_Test
这篇关于C++20中lambda表达式新增加支持的features的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!