es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo convertir de const void* en una expresión constexpr?

Estoy tratando de reimplementar memchr como constexpr (1). No esperaba tener problemas ya que ya lo hice exitosamente con strchr, que es muy similar.

Sin embargo, tanto clang como gcc se niegan a convertir const void* a cualquier otra cosa dentro de una función constexpr, lo que me impide acceder a los valores reales.

Entiendo que trabajar con void* en una función constexpr es extraño, ya que no podemos hacer malloc y no hay forma de especificar datos arbitrarios como valores literales. Estoy haciendo esto básicamente como parte de un ejercicio para reescribir tanto como sea posible de como constexpr (2).

Aún así, me gustaría saber por qué esto no está permitido y si hay alguna manera de evitarlo.

¡Gracias!

(1) Mi implementación de memchr:

constexpr void const *memchr(const void *ptr, int ch, size_t count) {
    const auto block_address = static_cast<const uint8_t="" *="">(ptr);
    const auto needle = static_cast<uint8_t>(ch);
    for (uintptr_t pos{0}; pos < count; ++pos) {
        auto byte_address = block_address + pos;
        const uint8_t value = *byte_address;
        if (needle == value) {
            return static_cast<void const="" *="">(byte_address);
        }
    }
    return nullptr;
}

(2) El proyecto completo en Github: https://github.com/jlanik/constexprstring

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Reimplementando memchr como constexpr y casteando const void*

    Como experto en tecnología de la información especializado en C++, casteo y constexpr, he estado intentando reimplementar memchr como constexpr. Aunque logré hacer lo mismo con strchr, me encontré con problemas inesperados con memchr.

    Tanto clang como gcc se negaron a castear const void* a cualquier otro tipo dentro de una función constexpr, lo que me impidió acceder a los valores reales. Aunque trabajar con void* en una función constexpr es extraño, ya que no podemos hacer malloc y no hay forma de especificar datos arbitrarios como valores literales, estoy haciendo esto como parte de un ejercicio para reescribir tanto como pueda de como constexpr.

    Sin embargo, me gustaría saber por qué no se permite el cast de const void* y si hay alguna forma de evitarlo.

    Aquí está mi implementación de memchr:

    constexpr void const *memchr(const void *ptr, int ch, size_t count) {
        const auto block_address = static_cast<const uint8_t="" *="">(ptr);
        const auto needle = static_cast<uint8_t>(ch);
        for (uintptr_t pos{0}; pos < count; ++pos) {
            auto byte_address = block_address + pos;
            const uint8_t value = *byte_address;
            if (needle == value) {
                return static_cast<void const="" *="">(byte_address);
            }
        }
        return nullptr;
    }
    

    Puedes encontrar todo el proyecto en Github: https://github.com/jlanik/constexprstring

Comments are closed.