我有這個示例代碼(下面),example1()方法工作沒有問題,example2()是相似的,但我必須強制const_char使它編譯,雖然我認爲是example1()方法是不需要,example2()也不需要。正確使用const C++
我的問題是,我怎樣才能修改add()方法,使兩個編譯或如何在不強制const_cast的情況下正確調用example2()中的buffer.add()? add()方法不修改項目,所以const_cast是不必要的。哪一種是正確的或合適的形式?
這裏的示例代碼:
template <class Item>
class Buffer
{
public:
Item * _pItems;
int _nItems;
// ... constructor/destructors etc
void add(const Item & item) // or maybe Item const & item
{
_pItems[_nItems++] = item;
}
};
class MyClass
{
public:
// data
};
void example1(const MyClass & item)
{
Buffer<MyClass> buffer;
buffer.add(item); // WORKS, no problem
}
void example2(const MyClass & item)
{
Buffer<MyClass *> buffer; // NOW with pointers to MyClass
//buffer.add(item); // ERROR: 'Buffer<Item>::add' : cannot convert parameter 1 from 'const MyClass' to 'MyClass *const &'
buffer.add(const_cast<MyClass *>(&item)); // forcing const_cast WORKS
}
'//強制const_cast WORKS'是的,但現在你的編譯器不會阻止你修改對象,這是_still UB_。這是一個粗糙的黑客,導致問題;它並沒有解決它們。 (有時候你需要這個破解來傳遞給舊的C函數,這些函數只有一個寫在註釋中的可變性契約,而不是'const'。) – 2011-05-07 16:47:24