我有一个返回const指针的转换运算符,我需要const_cast它。但是,这不起作用,至少在MSVC8下。以下代码重现了我的问题:
class MyClass {
public:
operator const int* () {
return 0;
}
};
int main() {
MyClass obj;
int* myPtr;
// compiles
const int* myConstPtr = obj;
// compiles
myPtr = const_cast<int*>(myConstPtr);
// doesn't compile (C2440: 'const_cast' : cannot convert from 'MyClass' to 'int *')
myPtr = const_cast<int*>(obj);
}
为什么?这似乎违反直觉。谢谢!
答案 0 :(得分:4)
要使其发挥作用,您必须这样做:
myPtr = const_cast<int*>(static_cast<const int*>(obj));
直接使用const_cast时,编译器会将转换运算符查找为int *。
答案 1 :(得分:2)
const_cast
只能更改类型的常量。如果要调用隐式运算符,则需要static_cast
,然后const_cast
。虽然它很烦人,但它确保你明确你在做什么。
myPtr = const_cast<int*>(static_cast<const int*>(obj));
您还可以使用旧学校的C风格演员
myPtr = (int*)(const int*)obj;
但出于以下几个原因,这是非常沮丧的:
const_cast
类型的操作并使用static_cast
强制执行此操作。事实上,你很少想要const_cast
。如果你发现自己经常这样做,你会遇到一些设计错误。编辑:我稍微偏了,我现在修好了。这使得c式演员变得更加丑陋
答案 2 :(得分:1)
你只能使用const_cast转换为相同类型的非const指针(抛弃constness)。要在不相关的类型之间进行转换,您需要reinterpret_cast。
答案 3 :(得分:1)
将const_cast<>
视为功能模板
template <typename Target, typename Source>
Target const_cast( Source src );
(这不是它的实现方式,但它有助于想象它是)。然后Source
被推断为MyClass
,并且const_cast
无法从MyClass获取int *。
您想要的是以下任何一种:
const_cast<int*>( static_cast<const int*>(obj) /* invokes operator const int* */ );
// or
const_cast<int*>( obj.operator const int*() );
答案 4 :(得分:-1)
如果您执行以下操作,您的编译器可能会更清楚:
myPtr = const_cast<int*>(obj());
我还没有尝试过,想过。
编辑: 操作员声明不应该像:
const int* operator () {