当使用 GCC (4.7.2-5ubuntu) 而不是 Clang (Apple LLVM 4.2) 编译时,此代码会在运行时生成 SIGSEGV
#include <functional>
#include <iostream>
using FuncType = std::function<int(int)>;
int func(FuncType f, int i) {
return f(i)+1;
}
struct Alpha {
FuncType f, g;
Alpha(FuncType f) : f(f) {
g = [&](int i) -> int {
return func(f, i);
};
}
int go(int i) {
return g(i);
}
};
struct Beta {
int k = 0;
Beta newBeta(int nk) {
Beta beta = *this;
beta.k = nk;
return beta;
}
};
struct Gamma {
Beta beta;
void go(int j) {
auto f = [&](int i) -> int {
int n = beta.newBeta(i).k+j;
return n*n;
};
Alpha alpha(f);
std::cout << alpha.go(beta.k) << std::endl;
}
};
int main(int argc, char *argv[]) {
Gamma gamma;
gamma.go(7);
return 0;
}
f
调试中,在调用lambda 时会发生崩溃func
。beta
报告为无效对象,即使在调用 lambda 时它应该仍然有效。
看起来这是这个错误的结果,但据报道该错误已在 4.7.2 中修复。
编辑:为清楚起见进行了初始化Beta::k
,不影响错误。