【发布时间】:2021-12-20 12:34:07
【问题描述】:
在以下程序结构S 中提供了两个转换运算符:double 和long long int。然后将S 类型的对象传递给函数f,为float 和double 重载:
struct S {
operator double() { return 3; }
operator long long int() { return 4; }
};
void f( double ) {}
void f( float ) {}
int main() {
S s;
f( s );
}
MSVC 编译器接受程序正常,选择f( double ) 重载。然而,GCC 和 Clang 在调用 f 时都看到了歧义,演示:https://gcc.godbolt.org/z/5csd5dfYz
似乎MSVC就在这里,因为转换:
operator long long int() -> f( float ) 不是促销。错了吗?
有一个类似的问题Overload resolution with multiple functions and multiple conversion operators,但是里面有一个提升案例,现在所有编译器都同意了,不像这个问题的案例。
【问题讨论】:
-
即使将
long long int转换运算符更改为bool也无济于事,这似乎很不幸,直觉上没有人会认为 bool->float 是个好主意。
标签: c++ language-lawyer overloading overload-resolution conversion-operator