在c++中优先使用隐式转换操作符

Make an implicit conversion operator preferred over another in C++

本文关键字:转换 操作符 c++      更新时间:2023-10-16

我更喜欢某个隐式转换序列而不是另一个。我有以下(大大简化的)类和函数:

class Whatever {...}
template <class T>
class ref
{
    public:
        operator T* ()
        {
            return object;
        }
        operator T& ()
        {
            return *object;
        }
        T* object;
        ...
};
void f (Whatever*)
{
    cout << "f (Whatever*)" << endl;
}
void f (Whatever&)
{
    cout << "f (Whatever&") << endl;
}
int main (int argc, char* argv[])
{
    ref<Whatever> whatever = ...;
    f(whatever);
}

当我有一个ref对象并且我对f进行了一个模棱两可的调用时,我希望编译器选择包含T&的对象。但在其他明确的情况下,我希望隐式转换保持不变。

到目前为止,我已经尝试引入一个中间类,它可以隐式地转换为ref,并且有一个隐式转换操作符到T*,因此转换序列将更长。不幸的是,它没有在明确的情况下认识到它确实可以转换为T*。当中间类有一个(n隐式)构造函数时,也会发生同样的事情。毫无疑问,这个版本与ref. 完全无关。

我还尝试了一个隐式转换操作符模板,结果相同。

两个转换之间没有"排序";两者都同样好,因此重载是模糊的。这是语言的核心部分,你不能改变。

但是,您可以通过显式转换指定您想要的重载:

f((Whatever&) whatever);

简单:定义void f(const ref<Whatever>&),它将胜过其他需要转换的

执行隐式转换时,只应用一个用户定义的转换函数。如果没有定义的转换函数,编译器不会寻找对象可以转换成的中间类型。