gpt4 book ai didi

c++ - C++11 中的递归 lambda 函数

转载 作者:IT老高 更新时间:2023-10-28 11:35:14 25 4
gpt4 key购买 nike

我是 C++11 的新手。我正在编写以下递归 lambda 函数,但它无法编译。

sum.cpp

#include <iostream>
#include <functional>

auto term = [](int a)->int {
return a*a;
};

auto next = [](int a)->int {
return ++a;
};

auto sum = [term,next,&sum](int a, int b)mutable ->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);
};

int main(){
std::cout<<sum(1,10)<<std::endl;
return 0;
}

编译错误:

vimal@linux-718q:~/Study/09C++/c++0x/lambda> g++ -std=c++0x sum.cpp

sum.cpp:在 lambda 函数中:sum.cpp:18:36: 错误:' ((<lambda(int, int)>*)this)-><lambda(int, int)>::sum ' 不能用作函数

gcc 版本

gcc 版本 4.5.0 20091231(实验性)(GCC)

但如果我更改 sum() 的声明如下,它可以工作:

std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);
};

有人可以解释一下吗?

最佳答案

想想 auto 版本和完全指定类型版本之间的区别。 auto 关键字从它初始化的任何内容中推断出它的类型,但是你初始化它需要知道它的类型是什么(在这种情况下,lambda 闭包需要知道它正在捕获的类型) .有点像先有鸡还是先有蛋的问题。

另一方面,完全指定的函数对象的类型不需要“知道”任何关于分配给它的内容,因此 lambda 的闭包同样可以完全了解其捕获的类型。

考虑一下对代码的这种轻微修改,它可能更有意义:

std::function<int(int, int)> sum;

sum = [term, next, &sum](int a, int b) -> int {
if (a > b)
return 0;
else
return term(a) + sum(next(a), b);
};

显然,这不适用于 auto。递归 lambda 函数运行良好(至少它们在 MSVC 中运行良好,我有使用过它们的经验),只是它们与类型推断并不真正兼容。

关于c++ - C++11 中的递归 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2067988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com