C++ lambda值捕获string引用不同场景报错差异原因求解
C++ Lambda值捕获引用类型变量的行为差异解析
核心原理
- 值捕获引用类型变量时,捕获的是引用指向的对象的副本,而非引用本身:你捕获的
retStateString是string&类型,但lambda内部生成的私有成员变量类型是std::string,和原引用没有关联。 - 未加
mutable修饰的lambda,其operator()方法默认是const修饰的,lambda体内所有成员变量都会被视为const类型,禁止修改。
报错代码原因
你调用的CService::GetServerState参数类型为string &(非const左值引用),但lambda体内的retStateString是const std::string类型,const对象无法绑定到非const引用,因此触发了限定符丢弃的编译错误。
对照测试代码正常运行的原因
测试代码的lambda仅读取bS的值做返回,未做任何修改操作,const std::string类型完全支持读取和值拷贝,因此不会触发编译错误。如果在测试代码的lambda内添加bS = "test";这类修改操作,会立刻出现相同的编译报错。
业务场景正确写法
你需要修改外部传入的retStateString,值捕获只会修改lambda内部副本完全不符合需求,应该使用引用捕获:
void CServiceList::GetAllState(string & retStateString) { for_each ( m_servicemap.begin(), m_servicemap.end(), // 改为引用捕获 [&retStateString](const pair<string, CService*> & x) { CService* instance = x.second; instance->GetServerState(retStateString); } ); }
内容的提问来源于stack exchange,提问作者doUWannaBuildASnowMan
相关产品推荐
相关产品推荐

