繁体   English   中英

为什么在C ++中不可能重载返回类型,而可能重载参数?

[英]Why is it is impossible to overload return type in C++, but possible to overload parameters?

我想知道,C ++编译器(或其他任何东西)中是否存在真正的技术限制,导致返回类型不能被重载,或者仅仅是在语言中插入了设计限制?

谢谢!

如果您要称呼它为技术限制,则:

C ++类型是自下而上推断的:表达式的类型仅取决于其子表达式,而与出现在其中的上下文表达式无关。因此,可以确定重载方法的参数类型,以便选择要调用的版本,但是如果返回类型上有重载,就不可能分辨出要调用的方法。

示例:在e1 + f(e2, e3) ,可以在选择f的版本之前确定e2e3的类型,然后才根据它们选择f的版本。 但是上下文不允许根据f的返回类型选择一个版本,实际上,可以接受几种类型作为返回类型。

函数调用是一个表达式。 每个表达式都有一个上下文,该上下文会影响表达式的求值方式,但是此信息不会在函数重载解析中使用。

在函数重载解析期间,将函数调用的参数表达式与查找函数名称时发现的一组函数的参数声明进行比较。 通过极其复杂的排序算法,它选择了最佳可行的函数,然后函数的返回类型给出了函数调用表达式的初始类型。 然后,将此返回类型与上下文进行比较,以确定是否需要转换(如果需要,如果可能且明确),以调整返回类型以适合上下文。

但是,这些上下文不是简单地由类型指定的。 每个上下文由标准中自己独特的一组规则指定。 因此,基于它们进行重载解析将极其复杂。

考虑例如:

f(g(x))

在这里,我们正在对fg执行重载解析。 假设每个函数有10个版本-并在重载解析中包含g(x)的上下文。

g(x)f的参数-因此上下文是“初始化10个不同函数的10个不同参数类型之一”。

x是要与10 g参数列表进行比较的参数。

因此,我们必须考虑fg每种可能组合,总共需要100种组合。

很容易看出这种方案是如何成倍增长的。 现在考虑:

f(g(h(p(x))))

这就是为什么在C ++函数中,分两步完成重载解析的原因。 对于示例f(g(x))

  1. 首先根据x选择g
  2. 然后确定g(x)的类型T
  3. 然后根据T选择f

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM