我有一個轉換運算符返回一個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