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

时间:2014-02-06 19:50:02

标签: c++ copy-constructor default-constructor

我在程序的一部分遇到麻烦,我将一个充当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;
}

2 个答案:

答案 0 :(得分:3)

我可以帮助您解决“如何修复此问题”部分 - 将您的功能更改为

void synchronizedExecution(const std::function<void()>& function)

答案 1 :(得分:0)

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

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

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

老实说,我不确定,b将被替换为(),类成员或函数参数。 AFAIR,班级成员优先,这不是你想要的。我怀疑你的实际问题有同样的原因。