具有自动 return 类型参数推导的可变参数模板
The variadic template with automatic return type argument deduction
我实现了简单的代码来将所有数字加在一起,但是当插入一个浮点数时,一切都变得很奇怪!
如何分析编译器的行为来推断return类型?
#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 ?
}
问题是 summer()
的 return 类型是双精度的,但您使用 %d
打印它。结果类似于您 运行 这样的代码:
printf("%d", 100.1);
这是 UB(未定义的行为)。引自 cpp ref:
If any argument after default conversions is not the type expected by the corresponding conversion specifier, or if there are fewer arguments than required by format, the behavior is undefined.
我实现了简单的代码来将所有数字加在一起,但是当插入一个浮点数时,一切都变得很奇怪!
如何分析编译器的行为来推断return类型?
#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 ?
}
问题是 summer()
的 return 类型是双精度的,但您使用 %d
打印它。结果类似于您 运行 这样的代码:
printf("%d", 100.1);
这是 UB(未定义的行为)。引自 cpp ref:
If any argument after default conversions is not the type expected by the corresponding conversion specifier, or if there are fewer arguments than required by format, the behavior is undefined.