【发布时间】:2020-11-15 11:07:58
【问题描述】:
在这个非常有趣的自动返回值推断用例中(取自:https://www.geeksforgeeks.org/type-inference-in-c-auto-and-decltype/):
// A generic function which finds minimum of two values
// return type is type of variable which is minimum
template <class A, class B>
auto findMin(A a, B b) -> decltype(a < b ? a : b)
{
return (a < b) ? a : b;
}
由于参数 a 和 b 不是可以在编译时计算的常量表达式,是否必须在运行时推断返回值的类型?我的意思是,对于每个实例化的函数调用,返回值必须是 A 类型或 B 类型,但在 compile-time 中不清楚它是哪一个。 a 不是常量表达式吗?
这是否意味着 c++ 是一种动态类型语言。如果不是,在编译时如何推导出函数的返回值?每个实例化是否创建了两个函数,一个返回 A 类型,另一个返回 B 类型?这将如何运作?
【问题讨论】:
-
对于给定的
A和B,您将只有一个函数,其返回类型是A和B的常见类型。 C++ 是一种静态类型语言。cond ? a : b的类型总是在编译时根据certain rules确定。 -
Geeksforgeeks 是一个不好的来源,避免它!
? :的类型是根据一些complicated rules 静态确定的(在编译时)。简而言之,编译器选择两个操作数都可以转换为的类型,并使用相同的类型,而不管条件的值如何。 -
@OS2 我相信您的意思是编译时,因为模板实例化不能在运行时发生,对吧? 如果我错了请纠正我,毕竟这也是原始问题的一部分
-
调用哪个函数是在编译时确定的。模板不是虚拟的。
-
在您使用模板或想知道编译器在做什么时使用此工具:cppinsights.io
标签: c++ templates types generic-programming