【发布时间】:2021-09-21 21:32:55
【问题描述】:
我实现了将所有数字相加的简单代码,但是当插入一个浮点数时,一切都变得奇怪了!
如何分析编译器的行为来推断返回类型?
#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 ?
}
【问题讨论】:
-
你可以问编译器:
template<typename>int whatis();int tellme = whatis<decltype(summer(4, 34.1, 13, 14, 15, 22))>();。这表示call int whatis<double>(),因此编译器推导出double。这是有道理的,因为4 + (34.1 + (13 + (14 + (15 + 22))))的推断类型是double。 -
这就是为什么
cout和朋友比printf和朋友“更安全”。 -
我喜欢
summer它是如此的阳光:)。
标签: c++ templates variadic-templates return-type-deduction