为什么mutable lambda带有指向成员函数的指针?

use*_*370 3 c++ lambda pointers c++11

我想把我的笨拙的爪子放在operator()lambda函数上.以下似乎完成了任务:

template <typename F>
void bar(F func) {
  void (F ::*pm)();
  pm = &F::operator();
}
Run Code Online (Sandbox Code Playgroud)

但是,在下面,我需要包含mutable关键字.这是为什么?是否有可能在上面声明一个指向成员函数的指针,它可以定位任意lambdas?

int main(int argc, char *argv[])
{
  bar([]() mutable {});
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 8

根据N3291 C++ 0x规范的5.1.2,lambda的operator()const除非你明确声明它mutable:

const当且仅当lambda表达式的parameter-declaration-clause未后跟时,才声明此函数调用运算符(9.3.1)mutable.

您可以做一些模板元编程魔术来检测哪个是哪个.

但是,应该注意的是,一旦func超出范围,就不能再使用该成员指针了.它是一个成员指针,而不是一个函数指针,所以你不能在两者之间进行转换.