为何将模板参数包传递给单模板参数函数会触发多次调用?
问题原因&代码运行逻辑解释
你提到的猜测不成立:foo本身不会返回参数包,触发多次调用的核心是...是C++的模板参数包展开运算符,会在编译期完成模式替换,生成多次独立的函数调用。
完整逻辑拆解如下:
模板参数推导阶段(编译期)
当main中调用bar(1,2,3,4)时,四个传入的实参都是int类型,编译器会自动推导可变参数模板bar的模板参数包Ts为<int, int, int, int>(函数参数包ts对应四个int值1,2,3,4,这段代码中未使用该参数包)。参数包展开阶段(编译期)
std::vector<int> vec{foo<Ts>()...};里的...会按照foo<Ts>()的固定模式,遍历参数包Ts的所有元素依次替换,最终展开为逗号分隔的多个表达式:
std::vector<int> vec{foo<int>(), foo<int>(), foo<int>(), foo<int>()};
这里的逗号是C++的表达式逗号,会严格保证从左到右的执行顺序。
- 运行阶段
执行bar函数构造vec时,会按顺序依次调用四个foo<int>()实例:
- 每次调用都会执行
std::cout打印逻辑,输出一行foo called - 每次调用返回
10,四个返回值作为初始化列表的元素,最终构造出包含4个10的vector容器
这就是最终输出四行日志的根本原因。
内容的提问来源于stack exchange,提问作者JensB
相关产品推荐
相关产品推荐

