C++ 如何使用函数指针声明lambda(没有auto)?

C++ 如何使用函数指针声明lambda(没有auto)?,c++,pointers,lambda,anonymous-function,auto,C++,Pointers,Lambda,Anonymous Function,Auto,我可以声明匿名函数(它们与lambda相同,但没有“上下文”-[…]),而无需auto即可轻松声明: #include <iostream> using namespace ::std; void foo(void (*f)(char)) { f('r'); } int main() { void (*anon)(char) = [](char c) -> void { cout << c << endl; }; foo(a

我可以声明匿名函数(它们与lambda相同,但没有“上下文”-
[…]
),而无需
auto
即可轻松声明:

#include <iostream>

using namespace ::std;

void foo(void (*f)(char))
{
    f('r');
}

int main()
{
    void (*anon)(char) = [](char c) -> void { cout << c << endl; };
    foo(anon);
    return 0;
}
你不能

闭包的类型是唯一的未命名类型。第一个示例之所以有效,是因为闭包类型在没有捕获任何内容的情况下有一个到函数指针的转换函数,而不是因为闭包是
void(*)(char)


您最好只使用
auto
,因为
std::function
可能会为类型擦除带来额外的开销。

auto
as参数是GCC和其他人提供的扩展。您可以改为使用模板:

template<typename T>
int callFoo(T funct, int x) {
    return funct(x+1);
}
模板
int callFoo(T函数,int x){
返回函数(x+1);
}

将foo定义为模板函数<代码>模板void foo(函数&&f){f('r');}“声明lambda”没有意义。lambda是表达式的一种类型,您不能删除表达式,就像您不能“声明求和”或“声明函数调用”一样。非捕获lambda表达式可以衰减为指向函数的指针,但它不是指向函数的指针。
template<typename T>
int callFoo(T funct, int x) {
    return funct(x+1);
}