繁体   English   中英

C ++。 为什么我不能编译此代码? 使用const_cast删除constness有什么问题?

[英]C++. Why I can't compile this code? What is wrong with removing constness using const_cast?

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

这个问题的本质是什么? 为什么我应该改用C样式转换?

“错误C2440:'const_cast':无法从'const 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;
}

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 临时副本 ,而无需强制转换; 但您无法分配给该临时工。

您正在尝试将size_t内容强制转换为r值,但无法将其分配给r值。

我不得不说,抛弃size_t成员的常数性是很邪恶的。 那就是可变的。 而且,AFAICS您的第一个const强制转换没有任何用处。

现在以这种方式工作...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM