![]() |
1
97
首先,让我说乔恩的回答是正确的。这是规范中最毛茸茸的部分之一,对于乔恩来说,这是一个很好的选择,因为他是第一个潜入IT领域的人。 第二,让我说这句话:
(重点补充)是非常误导和不幸的。我要和Mads谈谈把“兼容”这个词从这里删掉。 这是误导和不幸的原因,因为这看起来像是在呼吁第15.2节“委托兼容性”。第15.2节描述了 方法和委托类型 但这是一个关于 方法组和委托类型 ,这是不同的。 既然我们已经排除了这一点,那么我们可以通过规范的第6.6节来了解我们得到了什么。 要进行过载解决,我们需要首先确定哪些过载是 适用候选人 . 如果所有参数都可以隐式转换为形参类型,则候选参数适用。考虑一下这个程序的简化版本:
所以让我们一行一行地通过它。
我已经讨论过“兼容”这个词在这里是多么不幸。继续前进。我们想知道,当对y(x)执行过载分辨率时,方法组x是否转换为d1?它转换成d2了吗?
到现在为止,一直都还不错。x可能包含一个适用于d1或d2参数列表的方法。
这句话真的没什么意思。
这句台词很吸引人。这意味着存在隐式转换,但这些转换可能会变成错误!这是C的一个奇怪规则。想离题一下,下面是一个例子:
增量操作在表达式树中是非法的。但是,lambda仍然是 可转换的 对于表达式树类型,即使使用了转换,也是错误的!这里的原则是,我们可能希望稍后更改表达式树中的规则;更改这些规则不应更改 类型系统规则 . 我们想强迫你把你的计划弄清楚 现在 当我们将来改变表达树的规则使它们更好的时候, 我们不引入过载分辨率的破坏性变化。 . 不管怎样,这是这种奇怪规则的另一个例子。为了解决过载问题,转换可以存在,但实际上是一个错误。尽管事实上,这并不是我们现在的处境。 继续:
好啊。所以我们在x上对d1做过载分解。d1的形式参数列表是空的,所以我们在x()和joy上执行重载解析,我们找到一个有效的方法“string x()”。同样,d2的形式参数列表也是空的。同样,我们发现“string x()”也是一个在这里工作的方法。 这里的原则是 确定方法组的可兑换性需要使用重载分辨率从方法组中选择方法 ,和 重载解析不考虑返回类型 .
方法组x中只有一个方法,因此它必须是最佳的。我们已经成功地证明了 存在 从x到d1,从x到d2。 现在,这一行是否相关?
实际上,不,不在这个节目里。我们从来没有激活过这条线。因为,记住,我们要做的是在y(x)上做过载分辨率。我们有两个候选人Y(d1)和Y(d2)。两者都适用。哪个是 更好的 ? 规范中没有描述这两种可能的转换之间的更好之处 . 现在,可以肯定地说,有效的转换比产生错误的转换更好。这实际上就是说,在本例中,重载解析确实考虑了返回类型,这是我们想要避免的。那么,问题是哪一个原则更好:(1)保持不变,即重载解析不考虑返回类型,或者(2)尝试选择一个我们知道可以在我们知道不会工作的转换上工作的转换? 这是一个判断。用 兰姆达斯 我们 做 在这些类型的转换中考虑返回类型,在第7.4.3.3节中:
不幸的是,方法组转换和lambda转换在这方面不一致。但是,我可以忍受。 无论如何,我们没有“betterness”规则来确定哪个转换更好,x到d1或x到d2。因此,我们给出了Y(x)分辨率的模糊误差。 |
![]() |
2
35
编辑:我想我明白了。
正如zinglon所说,这是因为
现在,我被第一句话弄糊涂了——它说的是如何转换为兼容的委托类型。
我认为简单地去掉等式中的超负荷是有指导意义的,看看转换的 存在 及其 适用性 可以显示。下面是一个简短但完整的示例:
中的两个方法调用表达式
换句话说,规范第7.4.3.1节找不到任何适用的功能成员。
以下是错误原因
这一次,它计算出了它想要调用的方法——但随后它无法执行所需的转换。不幸的是,我找不到规范中进行最终检查的地方——看起来是这样的。 可以 在7.5.5.1,但我不知道具体在哪里。 旧的答案被删除了,除了这一点-因为我希望埃里克能阐明这个问题的“为什么”… 仍在寻找…同时,如果我们说“埃里克·利珀特”三次,你认为我们会去拜访(这样就有了答案)吗? |
![]() |
3
1
使用
歧义也发生在
我还得到了这个模糊度错误:
进一步的实验表明,当方法组由自己传递时,在确定要使用哪个重载时,返回类型被完全忽略。
|
![]() |
4
0
超载
如果您注意到了,编译器不知道要调用哪个,因为它们只在返回类型上有所不同。 |