1

我在使用 const_cast 删除 constness 时遇到了一些问题。错误消息说“转换是有效的标准转换.....”

这个问题的本质是什么?为什么我应该使用 C-style cast 代替?

"error C2440: 'const_cast' : cannot convert from 'const size_t' to 'size_t'"

template<typename T>
const IFixedMemory* FixedMemoryPkt<T>::operator=(const IFixedMemory* srcObj)
{
    // doesn't remove constness this way. why?
    const_cast<char*> (this->m_Address) = (char*)srcObj->GetAddress();

    // compile this way, but maybe(?) undefined behaviour
    // const_cast<char*&> (this->m_Address) = (char*)srcObj->GetAddress();

    // doesn't doesn't work too
    const_cast<size_t> (this->m_Size) = (size_t)(srcObj->GetSize());
    // const_cast<size_t> (this->m_Size) = 0;

    return this;
}

template<typename T>
class FixedMemoryPkt : public IFixedMemory
{
private:
    const size_t m_Size;
    const char*  m_Address;
}

class IFixedMemory
{
public:
    virtual const char* GetAddress() const = 0;
    virtual size_t GetSize() const = 0;
}
4

3 回答 3

8

const_cast用于从指向const对象的指针或引用转换为它们的非const等价物。但是,如果对象本身是 ,则不能使用它们来修改它们引用的对象const。没有有效的修改方法m_Size;如果你想修改它,那么不要声明它const

您不需要强制转换来分配给指针,因为指针本身不是const

this->m_Memory = srcObj->GetAddress();

如果您确实希望指针本身为const,那么const将在之后出现*

char * const m_Address;

并且,与 一样const size_t,您将无法重新分配它。

正如错误所说,您可以将一个const 转换为该值的非const 临时副本而无需强制转换;但你不能分配给那个临时的。

于 2012-09-07T16:44:33.560 回答
2

您正在尝试将 size_t 事物转换为 r 值,并且无法分配给 r 值。

我不得不说抛弃你的 size_t 成员的常量是非常邪恶的。这就是 mutable 的用途。而 AFAICS 你的第一个 const 演员没有任何用处。

于 2012-09-07T16:46:08.553 回答
0

现在这样工作...

template<typename T>
const IFixedMemory* FixedMemoryPkt<T>::operator=(const IFixedMemory* srcObj)
{
   this->m_Address = srcObj->GetAddress();
   this->m_Size = srcObj->GetSize();
   return this;
}

template<typename T>
class FixedMemoryPkt : public IFixedMemory
{
private:
    const char* m_Address;
    size_t      m_Size;
};
于 2012-09-07T17:37:03.067 回答