有没有办法使lambda衰减到指针,而没有明确地转换为正确的签名?这将整理一些代码:
template<typename T> T call(T(*func)()){ return func(); } int ptr(){ return 0; } int main(){ auto ret1 = call(ptr); auto ret2 = call((int(*)())([]{ return 0; })); auto ret3 = call([]{ return 0; }); //won't compile }
很明显,只有当lambda衰减到指针时,调用调用才起作用,但我猜测只有在选择了正确的函数重载/模板之后才会发生这种情况.不幸的是,我只能想到涉及模板的解决方案来制作一个带有任何签名衰变的lambda,所以我回到原点.
解决方法
你可以改变你的lambda来使用一元运算符:[] {return 0; }
这是有效的,因为一元加号可以应用于指针,并将触发隐式转换为函数指针.