【问题标题】:Auto return value inference and c++ static typing自动返回值推断和 C++ 静态类型
【发布时间】: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 类型?这将如何运作?

【问题讨论】:

  • 对于给定的AB,您将只有一个函数,其返回类型是AB 的常见类型。 C++ 是一种静态类型语言。 cond ? a : b的类型总是在编译时根据certain rules确定。
  • Geeksforgeeks 是一个不好的来源,避免它! ? : 的类型是根据一些complicated rules 静态确定的(在编译时)。简而言之,编译器选择两个操作数都可以转换为的类型,并使用相同的类型,而不管条件的值如何。
  • @OS2 我相信您的意思是编译时,因为模板实例化不能在运行时发生,对吧? 如果我错了请纠正我,毕竟这也是原始问题的一部分
  • 调用哪个函数是在编译时确定的。模板不是虚拟的。
  • 在您使用模板或想知道编译器在做什么时使用此工具:cppinsights.io

标签: c++ templates types generic-programming


【解决方案1】:

您将获得一个返回常见类型值的函数AB。 C++是一种静态类型语言,所以cond ? a : b的类型应该在编译时就知道了。有special rules 来确定常见的类型。通俗地说,它是AB 可以隐式转换成的类型。如果不存在这样的类型,则会出现编译错误。

例如,

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

c 的类型将始终为 double。如果a小于b,则返回值将a转换为double,如同static_cast&lt;double&gt;(a)

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 2014-03-05
    • 2019-10-19
    • 2016-05-26
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多