我想知道,C ++编译器(或其他)中是否存在真正的技术限制,导致返回类型无法重载,或者只是插入到语言中的设计限制?
谢谢!
答案 0 :(得分:4)
这是一个技术限制,如果你想称之为:
C ++类型是自下而上推断的:表达式的类型仅取决于其子表达式,而不取决于它出现的上下文表达式。因此可以确定重载方法的参数类型为了选择要调用的版本,但如果在返回类型上有重载,则无法确定调用哪个方法。
示例:在e1 + f(e2, e3)
中,可以在选择e2
版本之前确定e3
和f
的类型,确实是f
的版本然后才根据它们选择。但是上下文不允许根据其返回类型选择f
的版本,实际上,有几种类型可以作为返回类型。
答案 1 :(得分:1)
函数调用是一个表达式。每个表达式都有一个影响表达式计算方式的上下文,但此信息不用于函数重载决策。
在函数重载解析期间,函数调用的参数表达式与查找函数名时找到的函数集的参数声明进行比较。通过极其复杂的排序算法,这将选择最佳可行函数,然后函数的返回类型给出函数调用表达式的初始类型。然后,将此返回类型与上下文进行比较,以确定是否需要转换(如果可行,是否可行且无明确)以调整返回类型以适合上下文。
然而,这些上下文不是简单地由类型指定的。每个上下文都由标准中自己独特的规则集指定。因此,基于它们进行重载解析将非常复杂。
考虑例如:
f(g(x))
我们正在f
和g
进行重载解析。假设每个函数有10个版本 - 假设我们在重载决策中包含g(x)
的上下文。
g(x)
是f
的参数 - 因此上下文是“初始化十种不同函数的十种不同参数类型之一”。
x
是与10个g
参数列表进行比较的参数。
因此,我们必须考虑f
和g
的所有可能组合,总共100种组合。
很容易看出这样的方案是如何成倍增长的。现在考虑:
f(g(h(p(x))))
这就是为什么在C ++函数中,重载分辨率分两步完成。对于示例f(g(x))
g
x
g(x)
的类型T f
T
醇>