0

谁能给我一个提示,为什么这段代码会产生内部编译器错误?我已经在 gcc 4.8.1 上对其进行了测试。

#include <functional>
#include <algorithm>
#include <iostream>
#include <vector>

class Dummy {
private:
    int dummy;
public:
    Dummy() { dummy = 0; }
    ~Dummy() { }
    int getDummy() const { return dummy; }
    void setDummy(int d) { dummy = d; }
};

class DummyCollection {
private:
    std::vector<Dummy> table;

public:
    void eachDummy(std::function<bool (const Dummy& d)>& closure) {
        for(const Dummy& d: table) {
            if(! closure(d))
                break;
        }
    }
};

DummyCollection dc;

void iterateDummies(std::function<bool (const Dummy& d)>& closure) {
    dc.eachDummy([&] (const Dummy& d) {
        return closure(d);
    });
}

int main() {
    iterateDummies([&] (const Dummy& d) {
        std::cout << "dummy " << d.getDummy() << std::endl;
        return true;
    });

    return 0;
}

这是编译器输出:

(2:514)$ g++ test.cpp -o test -std=c++11
test.cpp: In lambda function:
test.cpp:34:2: internal compiler error: in pop_binding, at cp/name-lookup.c:382
  });
  ^
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://bugs.archlinux.org/> for instructions.

第 34 行是iterateDummies函数的结尾。似乎无法从另一个 lambda 函数调用 lambda 函数,这是真的吗?

4

2 回答 2

1

正如输出所指出的,这不一定是您的代码中的缺陷 - 编译器开发人员有某种缺陷需要处理。您应该按照链接中的错误报告说明进行操作。

于 2013-06-17T00:01:01.167 回答
1

我已经向 ArchLinux bugzilla 报告了这个问题并得到了这个答案,所以我将把它粘贴在这里以供其他 googlers 使用:

https://bugs.archlinux.org/task/35803

gcc-4.9-20130324 BAD
gcc-4.9-20130331 GOOD
于 2013-06-17T10:07:42.343 回答