如果我正在重载类型转换运算符,当需要隐式转换但找不到时,我会遇到编译错误。考虑一个简单的示例,其中我有一个包含类型(在本例中为 long long)的包装类:
class my_wrapper
{
long long state;
public:
my_wrapper(long long _in) : state(_in) {}
my_wrapper& operator=(const long long rhs)
{
state = rhs;
return *this;
}
operator long long()
{
return state;
}
};
现在的问题是,如果我想将代码转换为其他内容(例如 void* ... 假设我为此使用 64 位),则如果不指定两个转换,则以下内容不起作用:
my_wrapper x1 = my_wrapper(5ll);
void* i1 = (void *) x1; // Compile Error: no suitable conversion function exists
void* i1 = (void *) (long long) x1; // Works
对比如果我写了类似的东西:
long long i1 = 5ll;
void* i2 = (void *) i1; // Works
没什么大不了的,只是好奇如果没有其他转换,是否可以指定“operator long long()”作为默认值。
最佳答案
[over.match.conv]/(1.1):
The conversion functions of
S
and its base classes are considered. Those non-explicit conversion functions that are not hidden withinS
and yield typeT
or a type that can be converted to typeT
via a standard conversion sequence (13.3.3.1.1) are candidate functions.
从整数类型到 void*
1 没有标准的转换序列,因此转换运算符不是候选对象。
您可以尝试转换运算符模板:
template <typename T>
operator T()
{
return T(state);
}
1 值为零的整数文字是异常(exception)。
关于c++类型转换运算符重载和隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28307887/