该标准似乎提供了两条规则来区分涉及用户定义的转换运算符的隐式转换序列:
13.3.3 最佳可行函数[over.match.best]
[...] 一个可行函数 F1 被定义为比另一个可行函数 F2 更好的函数,如果 [...]
- 上下文是通过用户定义的转换(参见 8.5、13.3.1.5 和 13.3.1.6)进行的初始化,从 F1 的返回类型到目标类型(即,正在初始化的实体的类型)的标准转换序列是比从 F2 的返回类型到目标类型的标准转换序列更好的转换序列。
13.3.3.2 对隐式转换序列进行排名[over.ics.rank]
3 - 两个相同形式的隐式转换序列是不可区分的转换序列,除非以下规则之一适用:[...]
- 如果用户定义的转换序列 U1 包含相同的用户定义的转换函数或构造函数或聚合初始化,并且 U1 的第二个标准转换序列优于第二个标准转换序列,则用户定义的转换序列 U1 是比另一个用户定义的转换序列 U2 更好的转换序列U2 的。
据我了解,13.3.3 允许编译器区分不同的用户定义的转换运算符,而 13.3.3.2 允许编译器区分不同的函数(某些函数的重载f
),每个函数都需要在其参数中进行用户定义的转换(请参阅我的侧边栏给定以下代码(在 GCC 4.3 中),为什么要调用两次引用转换?)。
是否有其他规则可以区分用户定义的转换序列?https://stackoverflow.com/a/1384044/567292的答案表明 13.3.3.2:3 可以根据隐式对象参数(到转换运算符)的 cv 限定或构造函数或聚合初始化的单个非默认参数,但我看不出这有什么关系,因为这需要在相应用户定义的转换序列的第一个标准转换序列之间进行比较,而标准没有t 似乎没有提及。
假设 S1 优于 S2,其中 S1 是 U1 的第一个标准转换序列,S2 是 U2 的第一个标准转换序列,是否可以得出 U1 优于 U2?换句话说,这段代码格式正确吗?
struct A {
operator int();
operator char() const;
} a;
void foo(double);
int main() {
foo(a);
}
g++ (4.5.1)、Clang (3.0) 和Comeau (4.3.10.1) 接受它,更喜欢 non-const-qualified A::operator int()
,但我希望它会因为模棱两可而被拒绝,因此格式不正确。这是标准的缺陷还是我对它的理解?