C++ 复制构造函数中的无限递归

C++ 复制构造函数中的无限递归,c++,copy-constructor,default-constructor,C++,Copy Constructor,Default Constructor,我在程序的某个部分遇到了问题,我将一个充当lambda函数的对象传递给另一个函数(我需要捕获此指针的常量,这样我就不能使用实际的lambda)。这会导致调用lambda的复制构造函数,该构造函数再次调用复制构造函数,最终堆栈溢出。我知道发生了什么,但我不确定复制构造函数为什么会调用自己,或者如何修复它。我在下面重现了这个问题 编译程序:MSVC 2010 #include <functional> void synchronizedExecution(std::function&l

我在程序的某个部分遇到了问题,我将一个充当lambda函数的对象传递给另一个函数(我需要捕获此指针的常量,这样我就不能使用实际的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;
}
#包括
void synchronizedExecution(std::function){
函数();
}
int main(int argc,char*argv[])
{
int b=0;
类函数:public std::Function{
公众:
国际酒店;
功能(内部和外部):
b(b){}
void运算符()({}
}职能(b);
同步执行(功能);
返回0;
}
我可以帮助您解决“如何修复此”部分-将您的功能更改为

void synchronizedExecution(const std::function<void()>& function)
void同步执行(const std::function&function)

首先,要解决您的问题,您可能可以通过引用而不是通过值来传递对象

其次,您的编码很容易出错。当您引入一个与现有名称相同的新名称时,您会遇到一个冲突,编译器会解决该冲突,但您并不总能得到预期的结果。比如说

   class Function
        int& b;
        Function(int& b) :
            b(b) {}

老实说,我不确定哪个
b
将被替换为()、类成员还是函数参数。AFAIR,类成员具有优先权,这不是您想要的。我怀疑您的实际问题也有相同的原因。

类声明/定义在
main()
中看起来是错误的(至少声明后缺少分号!)。声明在我看来很好。分号就在实例后面。在g++下它很好(没有递归)…您使用的是Visual Studio 2010还是2012?类声明/定义很好-它只是使用另一种语法来声明类的变量并用构造函数初始化它,传递
b
。从
std::function
中写入是一个可怕的想法。你为什么要这样做?这取决于,我可以看到用户希望函数实际复制到哪里(因为synchronizedExecution是一个函数,我猜异步也是一个选项)@MadScienceDreams:通过值传递将是。坏消息。@Fredrarson我在想,但它在g++中没有爆炸,我仍在试图找出原因…@MadScienceDreams:我打赌它也没有调用
Function::operator()()
。我的代码以某种方式增长,这让我觉得即使我通过引用传递,我也必须在某个时候复制函数。但现在我认为情况并非如此,所以我认为这会奏效。