我有一个非常简单的代码示例,-O2
在 gcc 8.2.0 下优化时崩溃
#include <vector>
#include <functional>
#include <iostream>
template<typename T, typename Container>
class Lambda_Expression
{
using Lambda = std::function<T()>;
const Lambda & _lambda;
public:
Lambda_Expression(const Lambda & l) : _lambda(l) {}
T operator[](const std::size_t i)
{
std::cerr << "inside expression [] " << i << std::endl;
return _lambda();
}
};
auto lambda = []() -> double
{
return 1.0;
};
int main()
{
int N = 10;
std::vector<double> res(N, 0.0);
double x = lambda();
std::cerr << "before for loop " << x << std::endl;
auto test_expression = Lambda_Expression<double, std::vector<double>>(lambda);
for( int idx=0; idx<N; ++idx )
{
std::cerr << "loop " << idx << std::endl;
double x = test_expression[idx];
}
}
也使用-std=c++17
,以防万一。
我明白了
before for loop 1
loop 0
inside expression [] 0
[1] 5288 segmentation fault ./bench_lambdas
而我希望循环运行 10 次迭代。优化级别低于 2 时不会出现此段错误。
上面的例子对我来说看起来是相当无害的代码,据我所知,2 级优化不应该破坏正确的代码。
问题: 我的示例中是否存在未定义的行为或不正确的代码,或者可能是什么问题?