在c++中优先使用隐式转换操作符
Make an implicit conversion operator preferred over another in C++
我更喜欢某个隐式转换序列而不是另一个。我有以下(大大简化的)类和函数:
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>&)
,它将胜过其他需要转换的
执行隐式转换时,只应用一个用户定义的转换函数。如果没有定义的转换函数,编译器不会寻找对象可以转换成的中间类型。
相关文章:
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- Clang vs GCC vs MSVC模板转换操作符-哪个编译器是正确的
- 模板类型转换操作符=
- 链接隐式转换操作符
- 强制转换操作符函数在g++中可以很好地编译,但在其他编译器中不行.为什么
- 当目标类有多个构造函数时,消除强制转换操作符的歧义
- 删除转换操作符
- 强制转换操作符重载和引用
- 实现没有临时的转换操作符
- 不同的强制转换操作符被不同的编译器调用
- 为什么模板化的用户定义转换操作符能够确定其返回类型?
- const转换操作符
- 调用转换操作符不能用于静态const变量
- 内部编译器错误-开关表达式中的模板化转换操作符
- 强制转换操作符可以是显式的吗?
- 不同的编译器使用不同的强制转换操作符
- 是否需要重载类的强制转换操作符?
- 类型转换操作符重载——Visual studio 2013内部错误
- ' auto x = type{…} '初始化语法和'显式'转换操作符- clang vs gcc
- 是否有方法为任何指针类型定义转换操作符