在C++中,惰性求值指的是把表达式的计算过程推迟到真正需要结果时才进行。借助Lambda表达式,我们可以把一段逻辑封装成可延迟调用的对象,从而实现简单且安全的惰性求值。

什么是惰性求值
惰性求值是一种求值策略,只有当值被使用时才执行计算。在C++里,我们通常用函数或 callable 对象来包装待执行的代码,而不是在定义时直接运行它。
用Lambda实现基础惰性求值
最简单的方式是把计算结果的逻辑写进 Lambda,并用 std::function 保存。下面示例展示如何延迟计算两个数的和:
#include <iostream>
#include <functional>
int main() {
// 定义惰性求值对象,此时并未计算和
std::function<int()> lazy_sum = []() {
int a = 10;
int b = 20;
return a + b;
};
std::cout << "尚未求值" << std::endl;
// 真正需要结果时才调用
int result = lazy_sum();
std::cout << "求值结果: " << result << std::endl;
return 0;
}
带缓存的惰性求值
如果计算很耗时且可能被多次使用,可以加上缓存,保证只计算一次:
#include <iostream>
#include <functional>
#include <optional>
class LazyValue {
public:
explicit LazyValue(std::function<int()> f) : func(f), cached(std::nullopt) {}
int get() {
if (!cached.has_value()) {
cached = func();
}
return cached.value();
}
private:
std::function<int()> func;
std::optional<int> cached;
};
int main() {
LazyValue lazy([]() {
std::cout << "执行复杂计算" << std::endl;
return 42;
});
std::cout << lazy.get() << std::endl;
std::cout << lazy.get() << std::endl; // 不会重复计算
return 0;
}
使用场景与注意事项
- 适合开销大、不一定用到的计算,如配置解析、远程请求模拟。
- 注意 Lambda 捕获的变量生命周期,避免悬空引用。
- 多线程下对缓存的访问需要加锁保护。
通过 Lambda 表达式实现惰性求值,代码直观且无需引入复杂框架,是C++日常开发中实用的小技巧。