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

为何将模板参数包传递给单模板参数函数会触发多次调用?

问题原因&代码运行逻辑解释

你提到的猜测不成立:foo本身不会返回参数包,触发多次调用的核心是...是C++的模板参数包展开运算符,会在编译期完成模式替换,生成多次独立的函数调用。

完整逻辑拆解如下:

  1. 模板参数推导阶段(编译期)
    当main中调用bar(1,2,3,4)时,四个传入的实参都是int类型,编译器会自动推导可变参数模板bar的模板参数包Ts为<int, int, int, int>(函数参数包ts对应四个int值1,2,3,4,这段代码中未使用该参数包)。

  2. 参数包展开阶段(编译期)
    std::vector<int> vec{foo<Ts>()...};里的...会按照foo<Ts>()的固定模式,遍历参数包Ts的所有元素依次替换,最终展开为逗号分隔的多个表达式:

std::vector<int> vec{foo<int>(), foo<int>(), foo<int>(), foo<int>()};

这里的逗号是C++的表达式逗号,会严格保证从左到右的执行顺序。

  1. 运行阶段
    执行bar函数构造vec时,会按顺序依次调用四个foo<int>()实例:
  • 每次调用都会执行std::cout打印逻辑,输出一行foo called
  • 每次调用返回10,四个返回值作为初始化列表的元素,最终构造出包含4个10的vector容器

这就是最终输出四行日志的根本原因。


内容的提问来源于stack exchange,提问作者JensB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:09:03