我想在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;
}
答案 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
变量。