我在程序的一部分遇到麻烦,我将一个充当lambda函数的对象传递给另一个函数(我需要捕获一个const这个指针,所以我不能使用实际的lambda)。这导致我的lambda的拷贝构造函数被调用,它再次调用拷贝构造函数,最终堆栈溢出。我理解发生了什么,但我不确定为什么复制构造函数正在调用自己或如何解决这个问题。我已经重现了下面的问题。
编译:MSVC 2010
#include <functional>
void synchronizedExecution(std::function<void()> function) {
function();
}
int main(int argc, char *argv[])
{
int b = 0;
class Function : public std::function<void()> {
public:
int& b;
Function(int& b) :
b(b) {}
void operator()() {}
} function(b);
synchronizedExecution(function);
return 0;
}
答案 0 :(得分:3)
我可以帮助您解决“如何修复此问题”部分 - 将您的功能更改为
void synchronizedExecution(const std::function<void()>& function)
答案 1 :(得分:0)
首先,要解决您的问题,您可以通过引用而不是按值传递对象。
其次,您的编码很容易出错。当您引入一个新名称并且它与现有名称相同时,您会遇到编译器解决的冲突,但您并不总是得到您期望的结果。例如
class Function
int& b;
Function(int& b) :
b(b) {}
老实说,我不确定,b
将被替换为(),类成员或函数参数。 AFAIR,班级成员优先,这不是你想要的。我怀疑你的实际问题有同样的原因。