|
1
31
它实际上是相当直的。为了
备选方案1(内置:13.6/13) (T是任意对象类型):
候选人2(你的接线员)
参数列表由
您会看到第一个参数与候选2的第一个参数完全匹配。但它需要用户为候选1的第一个参数定义转换。所以对于第一个参数,第二个候选人获胜。 你也可以看到第二个位置的结果取决于。让我们做一些假设,看看我们得到了什么:
现在,
对于我们的第一个假设,我们不会得到一个整体的胜利者,因为候选2会赢得第一个参数,候选1会赢得第二个参数。我称之为 纵横交错 . 对于我们的第二个假设,候选2总体上胜出,因为两个参数的转换都不差,但第一个参数的 更好的 转换。 对于第一个假设,第二个参数中的积分转换(int到unsigned)与第一个参数中其他候选项的用户定义转换相比,没有什么问题。纵横交错,规则很粗糙。 最后一点可能还是会让你困惑,因为周围的人都在大惊小怪,所以让我们举个例子。
这给了你同样令人困惑的GCC警告(我记得,这实际上是混淆了我的地狱当我几年前第一次收到它),因为
|
|
2
13
使用表达式:
编译器必须将焦点放在左侧以确定要执行的操作,因此
调用不完全匹配任何函数,因为
这个
Q1 :并非所有编译器都以相同的方式遵守标准。发现在某些特定情况下编译器的执行方式与其他编译器的执行方式不同是很常见的。在这种情况下,G++实现人员决定抱怨标准不允许编译器选择,而Intel实现人员可能只是悄悄地应用了他们喜欢的转换。
Q2
:更改用户定义的签名时
|
|
|
3
0
我不知道确切的答案是什么,但是… 因为这个操作员:
已经有内置的
//编辑
|
|
|
4
0
在我看来
编译器必须在两者之间进行选择。
如果
然后是普通数组索引,在这种情况下,索引的类型完全匹配。 至于这个错误,作为编译器扩展的gcc似乎想为您选择第一个重载,而您正在使用-pedantic和/或-werror标志进行编译,这迫使它坚持标准的说法。 (我没有学究的心情,所以没有引用标准中的任何一句话,尤其是关于这个主题的话。) |
|
|
5
0
我试着向两位候选人展示T[1][1]这个词。这两个等级(转换)相等。因此歧义 我认为这里要注意的是,根据13.6/13的内置[]运算符定义为
在我的系统上,ptrdiff_t被定义为“int”(这是否解释了x64行为?)
编辑: 以下是我的想法: 对于候选1(运算符[]),转换序列s1是 用户定义的转换-标准转换(int到size_t) 对于候选2,转换序列s2是 用户定义的转换->int到ptrdiff_t(对于第一个参数)->int到ptrdiff_t(对于第二个参数) 转换序列s1是s2的子集,应该更好。但这是个陷阱… 下面引用的标准应该会有所帮助。
这里是和条件的第一部分” 如果它们包含相同的用户定义的转换函数或构造函数 “不行。所以,即使和条件的第二部分 如果U1的第二个标准转换序列优于U2的第二个标准转换序列。 “很好,s1和s2都不是首选。 这就是为什么海湾合作委员会 幻影 错误消息“ISO C++表示这些是模棱两可的,即使第一个最坏的转换比第二个最坏的转换更好”。 这就很好地解释了模糊性。 |
|
6
0
过载解决是一个头痛的问题。但由于您偶然发现了一个修复(消除了将索引操作数转换为
不幸的是,我不能测试这个,因为GCC 4.2.1和4.5接受您的示例,而没有根据
而且,一旦我消除了对提振的依赖,它就通过了Comeau。 |
|
|
sungjun cho · 函数模板重叠多个匹配项 1 年前 |
|
|
Amaterastis · 基类接受子类和内部子类的模板参数 1 年前 |
|
|
111111 · 确定作为模板参数传递的函数的参数类型 1 年前 |
|
|
Sam · 在LaTeX中将图像添加到预制的投影仪中 1 年前 |
|
|
user416983 · 模板函数成员作为模板参数 1 年前 |
|
|
PyOPTProblem · c++如何模板化模板参数的部分实例化? 1 年前 |