具有自动返回类型参数推导的可变参数模板

Ami*_*lar 2 c++ templates variadic-templates return-type-deduction

我实现了将所有数字相加的简单代码,但是当插入一个浮点数时,一切都变得奇怪了!

如何分析编译器的行为来推断返回类型?

#include <iostream>

template <typename N>
auto summer(N n)
{
    return n;
}

template <typename N, typename... Args>
auto summer(N n, Args... args)
{
    return n + summer(args...);
}

int main()
{
    printf("add: %d \n", summer(4, 34.1, 13, 14, 15, 22)); // Print 22 ?!??!? return last number.
    printf("add: %d \n", summer(4, 34.1, 13, 14, 15, 20)); // Print 20 ?!!?!? return last number.
    printf("add: %f \n", summer(4, 34.1, 13, 14, 15, 20)); // It's true 100.1000 ?
}
Run Code Online (Sandbox Code Playgroud)

Afs*_*hin 7

问题是返回类型summer()是双精度的,但是您使用%d. 结果类似于您运行这样的代码:

printf("%d", 100.1);
Run Code Online (Sandbox Code Playgroud)

这是UB(未定义行为)。来自cpp ref 的引用

如果默认转换后的任何参数不是相应转换说明符预期的类型,或者如果参数少于格式要求的数量,则行为未定义。