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.

concepto std::equality_comparable_with no funciona para el operador de igualdad definido por el usuario.

Intento probar durante la compilación si dos tipos son comparables en igualdad, y he definido operator== para ellos, así que deberían serlo. Sin embargo, el siguiente código no se compila:

#include <string_view>

struct A { int n; };
bool operator==(const A& a, const std::string_view s) { return a.n == s.size(); }

static_assert(std::equality_comparable_with<a, std::string_view="">);

(godbolt)
Incluso he intentado definir operator== en el orden opuesto y para A con sí mismo, pero tampoco funciona.

Por supuesto, algo como lo siguiente funciona perfectamente:

static_assert(std::equality_comparable_with<std::string, std::string_view="">);

¿Qué me estoy perdiendo aquí?</std::string,></a,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que definir operator== para dos tipos no los hace automáticamente comparables en igualdad en C++. Para poder usar std::equality_comparable_with para dos tipos, los tipos deben declararse explícitamente como comparables en igualdad utilizando la palabra clave requires.

    Por ejemplo, el siguiente código debería compilarse correctamente:

    #include <string_view>
    
    struct A { int n; };
    bool operator==(const A& a, const std::string_view s) { return a.n == s.size(); }
    
    template<typename t,="" typename="" u="">
    concept EqualityComparable = requires(T t, U u) {
        { t == u } -> std::boolean;
        { u == t } -> std::boolean;
    };
    
    static_assert(EqualityComparable<a, std::string_view="">);
    

    Aquí, hemos definido un concepto EqualityComparable que requiere que tanto t == u como u == t sean expresiones válidas y devuelvan un bool. Luego podemos usar este concepto con static_assert para probar si A y std::string_view son comparables en igualdad.

    Ten en cuenta que esta característica fue introducida solo en C++20, por lo que si estás trabajando con una versión anterior del lenguaje, es posible que necesites utilizar un enfoque diferente.</a,>

Comments are closed.