传递给模板函数时lambda自动衰减到函数指针

Lor*_*one 7 c++ lambda templates function-pointers c++11

有没有办法使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
}
Run Code Online (Sandbox Code Playgroud)

很明显,call只有在lambda衰减到指针时调用才能工作,但我猜测只有在选择了正确的函数重载/模板之后才会发生这种情况.不幸的是,我只能想到涉及模板​​的解决方案来制作一个带有任何签名衰变的lambda ,所以我回到原点.

Sim*_*ple 14

您可以更改lambda以使用一元运算+符:+[]{ return 0; }

这是有效的,因为一元加号可以应用于指针,并将触发隐式转换为函数指针.

  • 可能是有史以来最好的c ++技巧的一个很好的入口. (4认同)