考虑以下 C++ 代码:
struct X {
operator int();
operator char();
};
struct Y {
operator int();
operator char();
};
void f(bool z) {
z ? X() : Y();
}
GCC 编译成功。Clang 给出一个错误:
错误:条件表达式不明确;'X' 和 'Y' 可以转换为几种常见的类型
MSVC 也报错:
错误 C2446: ':': 没有从 'Y' 到 'X' 的转换
注意:没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
哪个编译器在这里是正确的,在这种情况下,C++ 标准的相关部分是什么?我的猜测是 [over.match.oper] 是适用的,但到目前为止我无法从中找出预期的行为。
更新:如果我们将两者都更改operator int()
为转换为其他类型,例如operator bool()
,那么 GCC 也会出错。也许有一些关于int
类型的特殊规则?