带mutable的Lambda传递给模板调用函数时编译错误的原因
为什么带mutable拷贝捕获的Lambda表达式传递失败?
核心原因
Lambda表达式的调用运算符operator()的const属性由是否带mutable关键字直接决定:
- 不带
mutable的Lambda:其生成的匿名仿函数类中,operator()是const成员函数,允许被const限定的对象调用; - 带
mutable的Lambda:其生成的匿名仿函数类中,operator()是非const成员函数,只能被非const限定的对象调用。
你的caller函数参数是const FunctorType& func,意味着func是一个const引用的仿函数对象。当传递change_data(带mutable的Lambda)时,尝试调用它的非constoperator(),这违反了C++中const对象只能调用const成员函数的规则,因此编译报错。
修复方案
有两种常见修复方式:
- 修改
caller的参数为非const引用
template <class FunctorType> void caller(FunctorType& func) { func(); }
- 如果必须保留
caller的const参数限定,那么需要放弃使用mutable,或者调整捕获方式(比如改用引用捕获,但这会改变原数据的生命周期依赖,需谨慎评估)
原问题代码与错误信息
#include <iostream> template <class FunctorType> void caller(const FunctorType& func) { func(); } int main() { double data[5] = {5., 0., 0., 0., 0.}; auto peek_data = [data]() { std::cout << data[0] << std::endl; }; auto change_data = [data]() mutable { data[0] = 4.2; }; caller(peek_data); // 此调用正常工作 caller(change_data); // 此调用失败 return 0; }
编译命令:clang++ -std=c++11 mutable_lambda.cpp
错误信息:
error: no matching function for call to object of type 'const (lambda at mutable_lambda.cpp:8:22)'
内容的提问来源于stack exchange,提问作者aaronfu
相关产品推荐
相关产品推荐

