为何C++函数类型别名可用于向函数传递lambda?
关于函数类型参数与Lambda兼容的C++标准依据
先看你测试的代码:
#include <iostream> using ft = int(int); void print_it (ft f, int a) { std::cout << f(a) << std::endl; } int main () { auto my_lambda = [] (int a) -> int { return 2 * a; }; print_it (my_lambda, 100); return (0); }
核心问题拆解与标准依据
函数类型参数的自动调整:
C++标准规定,当你将函数类型作为函数参数时,编译器会自动将其调整为对应的函数指针类型。也就是说,你写的void print_it (ft f, int a),实际等价于void print_it (int(*f)(int), int a)——不管是用typedef还是using定义的函数类型别名,都会触发这个调整规则。无捕获Lambda的隐式转换:
对于没有捕获任何外部变量的Lambda表达式(即[]开头,没有[=]或[&]等捕获列表),C++标准允许它隐式转换为签名匹配的函数指针类型。你的Lambda[] (int a) -> int { return 2 * a; }没有捕获变量,因此可以自动转换成int(*)(int)类型,刚好匹配print_it被调整后的参数类型,所以调用是合法的。
内容的提问来源于stack exchange,提问作者sperber
相关产品推荐
相关产品推荐

