我正在测试惰性求值的实现。为此,我将一个 lambda 函数作为参数传递给成员构造函数,该函数仅在第一次评估发生时执行。但是,我注意到 lambda 函数可以通过捕获的变量访问类成员变量,并且我可以在 lambda 函数内部修改它们。
template<typename T>
class Lazy {
private:
std::function<T()> get_value;
mutable std::mutex mutex;
mutable bool evaluated = false;
mutable T value;
public:
Lazy(std::function<T()> f) : get_value(f) {}
const T& operator()() const {
std::lock_guard<std::mutex> lock(mutex);
if(!evaluated) {
value = get_value();
evaluated = true;
}
return value;
}
};
struct Foo {
private:
double x;
public:
Lazy<double> root;
Foo(double _x) : x(_x), root(
[this]()->double {
double a = x/2;
std::cout << "Calculating root of " << x << std::endl;
for(auto i:iota(0, 1000000000)) a = (a + x/a) / 2;
x = 3; //try to modify this-> x
return a;
}
) {}
};
void print_root(const Foo& f) {
for(auto i:iota(0,10)) std::cout << f.root() << std::endl;
}
然后 g++ 编译器不报告任何错误。