C ++。 为什么我不能编译这段代码? 什么是错误使用的const_cast去除常量性?(C+

2019-10-17 05:29发布

我有一些问题,消除常量性使用的const_cast。 错误味精说“转换为有效的标准转换......”

这是什么问题的本质是什么? 为什么要使用C样式转换呢?

““错误C2440:‘的const_cast’不能从‘常量为size_t’到‘为size_t’转换”的转换是一个有效的标准转换,其可以隐含地或通过使用的static_cast,C样式转换或函数样式转换来执行”

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;
}

Answer 1:

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不进行强制转换该值的临时副本 ; 但你不能分配给暂时的。



Answer 2:

您正在尝试施放的size_t事情的r值,你不能分配给r值。

我不得不说,虚掷你的size_t成员的常量性是相当邪恶。 这就是可变的是。 而AFAICS你的第一个常量投没有任何用处。



Answer 3:

现在的工作这样...

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;
};


文章来源: C++. Why I can't compile this code? What is wrong with removing constness using const_cast?