const cast — C ++. Почему я не могу скомпилировать этот код? Что плохого в удалении констант с помощью const_cast?

У меня есть некоторые проблемы с удалением констант с помощью 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;
}

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 временная копия этого значения без приведения; но вы не могли назначить это временное.

8

Другие решения

Вы пытаетесь привести вещь size_t к r-значению, и вы не можете присвоить r-значению.

Я должен сказать, что отбрасывание константности вашего члена size_t является довольно злым. Это то, что изменчиво для. И AFAICS ваш первый конст-бросок не делает ничего полезного.

2

Работает так сейчас …

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;
};
0
По вопросам рекламы [email protected]