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

时间:2011-07-29 23:52:34

标签: c++ pointers lambda c++11

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

template <typename F>
void bar(F func) {
  void (F ::*pm)();
  pm = &F::operator();
}

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

int main(int argc, char *argv[])
{
  bar([]() mutable {});
  return 0;
}

3 个答案:

答案 0 :(得分:8)

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

  

此函数调用运算符声明为const(9.3.1)当且仅当lambda-   expression的parameter-declaration-clause后面没有mutable

你可以做一些模板元编程魔法来检测哪个是哪个。

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

答案 1 :(得分:4)

C ++ 0x lambdas默认为const,与语言的其他部分不同。因此,您的member-function变量也必须是const。以下应该有效:

template<typename F>
void bar(F func) {
    typedef void (F::*pm_t)() const;
    pm_t pm = &F::operator();
}

答案 2 :(得分:1)

考虑一下:

int x=0;
auto show = [x]() mutable
{
        x++;
};

show();

变量'x'正在被捕获按值,而没有mutable,您无法修改此变量的本地副本。指定mutable以启用此本地副本的修改。对于按值捕获,如果修改了值无关紧要,则不会修改原始x变量。