Сообщение 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
Судя по всему, твоя попытка оказалась неудачной просто по причине не совсем корректной обработки константности.
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
Похоже что, твоя попытка оказалась неудачной просто по причине не совсем корректной обработки константности.
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;
};