如何修复Stroustrup的Sync_queue类Lambda捕获相关编译错误?
修复Sync_queue put方法中的Lambda捕获编译错误
嘿,这个编译错误的原因其实一目了然:你在Lambda表达式里用到了函数参数min_size,但当前的捕获列表[this]只抓了类的this指针,根本没把这个局部参数包含进去,编译器当然找不到它啦!
具体修复方案
有几种靠谱的方式可以解决,你可以根据需求选:
按值捕获
min_size(最推荐)
把Lambda的捕获列表改成[this, min_size],这样会把min_size的值复制一份到Lambda内部,完全不用担心生命周期问题:bool low = cnd.wait_for( lck, d, [this, min_size] {return q.size() < min_size;});这里用值捕获特别合适,因为
min_size是轻量的unsigned int,复制成本可以忽略,而且我们要判断的就是调用put时传入的那个阈值,副本完全符合逻辑。按引用捕获(不推荐此场景)
要是写成[this, &min_size],会捕获参数的引用,但这里不建议这么做——min_size是函数的局部参数,虽然wait_for没结束前函数不会返回,但从代码安全性和可读性来说,值捕获更稳妥,避免潜在的悬空引用风险。默认捕获(谨慎使用)
也可以用[=](按值捕获所有外部变量)或者[&](按引用捕获),但这样会把当前作用域里所有外部变量都抓进来,包括你不需要的,可能导致不必要的复制或者意外的引用,所以这种明确只需要this和min_size的场景,显式捕获更清晰。
补充:为什么原来的代码报错?
C++的Lambda捕获规则很严格:如果没指定捕获默认(比如=或&),那Lambda里用到的所有外部变量都必须显式列在捕获列表里。你原来只写了[this],编译器找不到min_size的捕获方式,自然就抛出错误啦。
内容的提问来源于stack exchange,提问作者SSteven
相关产品推荐
相关产品推荐

