为何可调用被const引用的可变lambda?C++代码运行疑问
为什么这段带
mutable lambda的C++代码能正常运行? 你的疑问逻辑是对的:带mutable的lambda,它的调用运算符operator()确实是非const成员函数,按常理const引用的lambda对象没法调用非const成员函数,但这段代码能跑通,核心原因在于你传入的是无捕获的mutable lambda,它有个特殊特性——可以隐式转换为对应的函数指针。
具体拆解:
- 无捕获的lambda(不管加不加
mutable)都能自动转换成和它调用签名匹配的函数指针类型。 - 当
exec里执行fn()时,编译器并没有直接调用lambda对象的operator(),而是把const引用的lambda对象转换成了函数指针,然后调用这个函数指针。函数指针的调用不受对象const属性的限制,所以代码能正常编译运行。
你可以试试给lambda加个捕获变量,这时候它没法转成函数指针,代码就会编译报错了:
int main() { auto exec = []( auto const &fn ) { fn(); }; int a = 1; exec( [a]() mutable { a++; } ); // 编译错误:无法在const限定的对象上调用非const成员函数 }
内容的提问来源于stack exchange,提问作者Edison von Myosotis
相关产品推荐
相关产品推荐

