Информация об изменениях

Сообщение Re[3]: constexpr и преобразование указателей от 18.11.2019 11:52

Изменено 18.11.2019 12:15 rg45

Re[3]: constexpr и преобразование указателей
Здравствуйте, Videoman, Вы писали:

V>Ну, собственно, так и было сделано до constexpr. m_data был void*, но как только к конструктору или оператору добавляется constexpr, компилятор тут же начинает ругаться что static_cast<uint8_t*>(m_data) — не разрешен во времени компиляции. В этом и вопрос, а как "двигать" указатель без каста тогда?


А вот так работает :

http://coliru.stacked-crooked.com/a/23431aeebb4072fd

Судя по всему, твоя попытка оказалась неудачной просто по причине не совсем корректной обработки константности.

class Buffer
{
public:
    
    template <typename T>
    constexpr Buffer(const T& data) : Buffer(&data, sizeof(data)) {}

    constexpr Buffer(const void* data, size_t size) : m_data(bytes(data)), m_size(size) {}

    constexpr Buffer& operator++() { m_data++; return *this; } // Нет проблем!!!

    constexpr size_t size() const { return m_size; }

//...
private:

    static constexpr uint8_t* bytes(const void* data) { return static_cast<uint8_t*>(const_cast<void*>(data)); }

    uint8_t* m_data;
    size_t m_size;
};
Re[3]: constexpr и преобразование указателей
Здравствуйте, Videoman, Вы писали:

V>Ну, собственно, так и было сделано до constexpr. m_data был void*, но как только к конструктору или оператору добавляется constexpr, компилятор тут же начинает ругаться что static_cast<uint8_t*>(m_data) — не разрешен во времени компиляции. В этом и вопрос, а как "двигать" указатель без каста тогда?


А вот так работает :

http://coliru.stacked-crooked.com/a/23431aeebb4072fd

Похоже что, твоя попытка оказалась неудачной просто по причине не совсем корректной обработки константности.

class Buffer
{
public:
    
    template <typename T>
    constexpr Buffer(const T& data) : Buffer(&data, sizeof(data)) {}

    constexpr Buffer(const void* data, size_t size) : m_data(bytes(data)), m_size(size) {}

    constexpr Buffer& operator++() { m_data++; return *this; } // Нет проблем!!!

    constexpr size_t size() const { return m_size; }

//...
private:

    static constexpr uint8_t* bytes(const void* data) { return static_cast<uint8_t*>(const_cast<void*>(data)); }

    uint8_t* m_data;
    size_t m_size;
};