You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:45:44