У меня есть некоторые проблемы с удалением констант с помощью const_cast. Сообщение об ошибке гласит: «Преобразование является допустимым стандартным преобразованием …..»
Какова природа этой проблемы? Почему я должен вместо этого использовать приведение в стиле 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 ваш первый конст-бросок не делает ничего полезного.
Работает так сейчас …
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;
};