如果我正在重载类型转换操作符,当需要隐式转换并且找不到一个时,我遇到了编译错误.考虑一个简单的例子,我有一个包含类型的包装类(在这种情况下是一个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值为零的整数文字是例外.