我想知道,C++ 编译器(或其他)是否存在真正的技术限制导致返回类型无法重载,或者它只是插入到语言中的设计限制?
谢谢!
这是一个技术限制,如果你想这样称呼它:
C++ 类型是自下而上推断的:表达式的类型仅取决于其子表达式,而不取决于它出现的上下文表达式。因此,可以确定重载方法的参数类型,以便选择要调用的版本,但如果返回类型重载,则无法确定要调用的方法。
示例: 在 中,和e1 + f(e2, e3)
的类型可以在选择版本之前确定,实际上只有根据它们选择版本。但是上下文不允许根据其返回类型选择一个版本,实际上,有几种类型可以作为返回类型。e2
e3
f
f
f
函数调用是一个表达式。每个表达式都有一个影响表达式计算方式的上下文,但此信息不用于函数重载决策。
在函数重载解析期间,函数调用的参数表达式将与查找函数名称时找到的函数集的参数声明进行比较。这通过一个极其复杂的排序算法,选出最佳可行函数,然后函数的返回类型给出函数调用表达式的初始类型。然后,将此返回类型与上下文进行比较,以确定是否需要进行转换(如果需要,是否可能且明确)以调整返回类型以适应上下文。
然而,这些上下文不是简单地由类型指定的。每个上下文都由标准中自己独特的规则集指定。因此,基于它们进行重载解析将非常复杂。
考虑例如:
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)
然后确定类型Tf
根据选择T