【发布时间】:2015-02-03 20:13:46
【问题描述】:
如果我重载类型转换运算符,当需要隐式转换并且找不到转换时,我会遇到编译错误。考虑一个简单的例子,我有一个包含类型(在本例中为 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()”作为默认值。
【问题讨论】:
-
不要在 C++ 中使用 C 样式转换。曾经。他们可以做与您期望的完全不同的事情。
-
同样的原因你不能写
(void*)2.5,或多或少。 -
为什么在 C++ 中使用
void*? :/ 有一些 C 库可以使用吗?你不能改为通过&x1吗?
标签: c++ casting overloading