我有一个转换运算符返回一个const指针,我需要const_cast它。但是,这至少在MSVC8下不起作用。以下代码重现了我的问题:为什么我不能const_cast转换运算符的返回?
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);
}
这是为什么?这似乎违反直觉。谢谢!
你真的想试着用`const int *`返回一个空指针吗?能够默默地将类转换为指向原语的指针通常也是不好的做法。 (例如,`std :: string`不能转换成`const char *`,而是提供一个`.c_str()`方法来返回一个指向它的数据的指针,这样更安全,因为程序员必须非常意识到他在做什么。) – 2009-07-13 13:20:03
@Seth:谢谢。这不是我真正的代码;这只是我写的重现我得到的错误!请放心,我没有特意返回空指针:-)就我而言,这个类是一个围绕字节数组的薄包装,我希望它的客户端使用它,就好像它是一个一样。 – 2009-07-13 13:23:21
如果你打算让用户能够直接操作字节数组,那么你应该给它们一个非const的操作符int *()`。一般只给出const版本意味着你允许读取但不能修改。强迫用户执行`const_cast`是我的书中的一个错误。 – 2009-07-13 13:39:56