c++ - 自动返回值推断和 C++ 静态类型

标签 c++ templates types generic-programming

在这个非常有趣的自动返回值推断用例中(取自: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 类型,但在编译时并不清楚它是哪一种。 a < b ? a : b 不是常量表达式吗?

这是否意味着 c++ 是一种动态类型语言。如果不是,那么在编译时如何推导出函数的返回值?每个实例化是否创建两个函数,一个返回 A 类型,另一个返回 B 类型?这将如何运作?

最佳答案

您将得到一个返回常见类型 A 的值的函数。和B 。 C++ 是静态类型语言,因此 cond ? a : b 的类型应该在编译时就知道。有special rules以确定该常见类型。通俗地说,它是 A 的类型。和B可以隐式转换为。如果不存在这样的类型,您将收到编译错误。

例如,

int    a = 1;
double b = 2;
auto   c = findMin(a, b);

c的类型永远是double 。如果a小于b ,返回值为a转换为double ,就好像 static_cast<double>(a) .

关于c++ - 自动返回值推断和 C++ 静态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63092955/

相关文章:

c++ - 模板类的对象创建包装器

actionscript-3 - ActionScript – 无类型变量的默认数据类型?

c - 返回值的类型检查

c++ - 根据条件和优先级搜索容器中的项目

c++ - 用模板实现派生类

c++ - 各种类型的默认模板参数

c++ - 编译器错误 : does not name a type

c++ - MEX 中 Matlab 和 C++ 之间的内存共享

java - C++ 客户端与 Java 服务器之间的通信

c++ - 程序在 SDL 中立即关闭