Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C++中不可能重载返回类型,但可能会过载参数? 我想知道,C++编译器中是否存在真正的技术限制,或者是什么原因导致返回类型不能重载,或者仅仅是一个插入到语言中的设计限制?_C++_Overloading - Fatal编程技术网

为什么在C++中不可能重载返回类型,但可能会过载参数? 我想知道,C++编译器中是否存在真正的技术限制,或者是什么原因导致返回类型不能重载,或者仅仅是一个插入到语言中的设计限制?

为什么在C++中不可能重载返回类型,但可能会过载参数? 我想知道,C++编译器中是否存在真正的技术限制,或者是什么原因导致返回类型不能重载,或者仅仅是一个插入到语言中的设计限制?,c++,overloading,C++,Overloading,谢谢 如果你想称之为: C++类型是自下而上推断的:表达式的类型只取决于它的子表达式,而不取决于它出现在其中的上下文表达式。因此,可以确定重载方法的参数类型,以便选择要调用的版本,但如果返回类型上存在重载,则无法确定要调用的方法 示例:在e1+fe2、e3中,e2和e3的类型可以在选择f的版本之前确定,事实上,f的版本只有根据它们来选择。但是上下文不允许根据返回类型选择f的版本,事实上,可以接受几种类型作为返回类型。如果您想将其称为: C++类型是自下而上推断的:表达式的类型只取决于它的子表达式

谢谢

如果你想称之为:

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


示例:在e1+fe2、e3中,e2和e3的类型可以在选择f的版本之前确定,事实上,f的版本只有根据它们来选择。但是上下文不允许根据返回类型选择f的版本,事实上,可以接受几种类型作为返回类型。

如果您想将其称为:

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


示例:在e1+fe2、e3中,e2和e3的类型可以在选择f的版本之前确定,事实上,f的版本只有根据它们来选择。但是上下文不允许根据返回类型选择f的版本,事实上,可以接受几种类型作为返回类型。

函数调用是一个表达式。每个表达式都有一个影响表达式计算方式的上下文,但此信息不用于函数重载解析

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

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

例如,考虑:

f(g(x))
这里我们对f和g进行重载解析。假设每个函数有10个版本——并且假设我们在重载解析中包含gx的上下文

gx是f-的一个参数,因此上下文是初始化十个不同函数的十种不同参数类型之一

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

所以我们必须考虑F和G的每一种可能的组合,总共有100种组合。

很容易看出这样一个方案是如何呈指数增长的。现在考虑:

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

这就是C++函数重载解决方案分两步进行的原因。例如fgx

首先,根据x选择g 然后确定gx的类型T 然后根据T选择f
函数调用是一个表达式。每个表达式都有一个影响表达式计算方式的上下文,但此信息不用于函数重载解析

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

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

例如,考虑:

f(g(x))
这里我们对f和g进行重载解析。假设每个函数有10个版本——并且假设我们在重载解析中包含gx的上下文

gx是f-的一个参数,因此上下文是初始化十个不同函数的十种不同参数类型之一

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

所以我们必须考虑电动汽车。 f和g的任何可能组合,总共100个组合

很容易看出这样一个方案是如何呈指数增长的。现在考虑:

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

这就是C++函数重载解决方案分两步进行的原因。例如fgx

首先,根据x选择g 然后确定gx的类型T 然后根据T选择f

那么编译器怎么知道选择哪一个呢?可能是@Stefan的副本这是绝对可能的。Java做到了这一点。C++也可以,用一个技巧。从函数返回赋值是可选的,所以不应该考虑overloading@GrijeshChauhan:在无法从上下文确定返回值的上下文中,调用具有重载返回类型的函数只会是一个不明确的函数调用,需要明确的消除歧义。那么编译器如何知道选择哪一个呢?可能是@Stefan的重复,这是绝对可能的。Java做到了这一点。C++也可以,用一个技巧。从函数返回赋值是可选的,所以不应该考虑overloading@GrijeshChauhan:在无法从上下文确定返回值的上下文中,调用具有重载返回类型的函数只会是一个不明确的函数调用,需要明确的消除歧义。我不认为这是技术限制。虽然编译器确实按照您描述的方式工作,但它这样做是因为标准要求它这样做。该语言可以设计为允许对返回类型进行重载,如果操作正确,编译器向编译器添加该功能将不会有问题。所以我想说这是语言中的一个设计限制,很遗憾。出于同样的原因,C++11枚举必须显式地解析范围,因为很明显类型必须是什么。由于语言是以自底向上的方式定义的,因此有时它会限制自身。@Damon:另一方面,对于用户定义的转换运算符,编译器有效地对返回类型进行重载。因此,没有主要原因说明不能更普遍地进行这项工作。我看到的唯一限制是,返回类型的重载必须是二级重载,只有在执行基于参数的重载之后才能执行,如果仍然存在歧义,只有在有足够的上下文的情况下才能完成,尤其是当它被用作一个函数本身重载的参数时,它将不起作用;这基本上就是类枚举的问题。我不会称之为技术限制。虽然编译器确实按照您描述的方式工作,但它这样做是因为标准要求它这样做。该语言可以设计为允许对返回类型进行重载,如果操作正确,编译器向编译器添加该功能将不会有问题。所以我想说这是语言中的一个设计限制,很遗憾。出于同样的原因,C++11枚举必须显式地解析范围,因为很明显类型必须是什么。由于语言是以自底向上的方式定义的,因此有时它会限制自身。@Damon:另一方面,对于用户定义的转换运算符,编译器有效地对返回类型进行重载。因此,没有主要原因说明不能更普遍地进行这项工作。我看到的唯一限制是,返回类型的重载必须是二级重载,只有在执行基于参数的重载之后才能执行,如果仍然存在歧义,只有在有足够的上下文的情况下才能完成,尤其是当它被用作一个函数本身重载的参数时,它将不起作用;这基本上就是类枚举的问题。返回类型重载可以通过添加另一个步骤来完成:目前,如果在第3步之后f中仍然存在歧义,重载解析将失败。相反,作为第四步,它可以查看调用的上下文,如果该上下文为gfx提供了足够的信息:如果g既没有重载也没有模板化,则参数将根据返回类型选择f。这仍然不如完整搜索一般,但可以避免指数增长问题。@celtschk:在排名算法中不包括上下文以及参数/参数不再是基于上下文的重载。你们已经可以实现你们想要的解决方案了。你们知道并没有真正的苏格兰人谬论吗?因为这就是你在这里要做的:你声称如果上下文相关的步骤只在参数相关的步骤之后完成,那么基于上下文的重载就不是真的。你用“真”这个词而不是“真”这个词,使它不亚于谬论的一个例子。只要重载解析的结果取决于上下文,就有上下文相关的重载解析。事实上,它已经可以用用户定义的转换运算符进行模拟,这证明它是可以实现的。@celtschk:好的,这取决于您对上下文相关重载解析的定义。对一些将军来说
对于其他更为有限的定义,不可能有效地进行定义。不管定义如何,我认为我们都成功地探索了这些问题。返回类型重载可以通过添加另一个步骤来完成:目前,如果在第3步之后f中仍然存在歧义,重载解析将失败。相反,作为第四步,它可以查看调用的上下文,如果该上下文为gfx提供了足够的信息:如果g既没有重载也没有模板化,则参数将根据返回类型选择f。这仍然不如完整搜索一般,但可以避免指数增长问题。@celtschk:在排名算法中不包括上下文以及参数/参数不再是基于上下文的重载。你们已经可以实现你们想要的解决方案了。你们知道并没有真正的苏格兰人谬论吗?因为这就是你在这里要做的:你声称如果上下文相关的步骤只在参数相关的步骤之后完成,那么基于上下文的重载就不是真的。你用“真”这个词而不是“真”这个词,使它不亚于谬论的一个例子。只要重载解析的结果取决于上下文,就有上下文相关的重载解析。事实上,它已经可以用用户定义的转换运算符进行模拟,这证明它是可以实现的。@celtschk:好的,这取决于您对上下文相关重载解析的定义。对于一些通用定义,它不可能有效地执行,对于其他更有限的定义,它是有效的。不管定义如何,我认为我们都成功地探讨了这些问题。