¿Es esto un error en std :: gcd?

14

Me he encontrado con este comportamiento std::gcdque encontré inesperado:

#include <iostream>
#include <numeric>

int main()
{
    int      a = -120;
    unsigned b =  10;

    //both a and b are representable in type C
    using C = std::common_type<decltype(a), decltype(b)>::type;
    C ca = std::abs(a);
    C cb = b;
    std::cout << a << ' ' << ca << '\n';
    std::cout << b << ' ' << cb << '\n';

    //first one should equal second one, but doesn't
    std::cout << std::gcd(a, b) << std::endl;
    std::cout << std::gcd(std::abs(a), b) << std::endl;
}

Ejecutar en el explorador del compilador

Según cppreference, ambas llamadas std::gcddeben ceder 10, ya que se cumplen todas las condiciones previas.

En particular, solo se requiere que los valores absolutos de ambos operandos sean representables en su tipo común:

Si cualquiera de | m | o | n | no es representable como un valor de tipo std::common_type_t<M, N>, el comportamiento es indefinido.

Sin embargo, la primera llamada vuelve 2. ¿Me estoy perdiendo de algo? Tanto gcc como clang se comportan de esta manera.

Dave
fuente
Curiosamente, gcc compila 2 ints para imprimir el valor, pero un int y un unsigned no: godbolt.org/z/koEVHh
Alan Birtles
¿Qué es -120 % 10u? (Sugerencia: no es 0.) Sí, error.
TC
@TC Sí, enviar -120a unsignedresultará en 4294967176cuál % 10ues 6. Mi pregunta era más bien si este comportamiento es realmente incorrecto, lo que parece ser.
Dave
@AlanBirtles En ese caso, no se lanzará unsigned, por lo que tampoco habrá ningún error
dave

Respuestas:

10

Parece un error en libstc ++. Si agrega -stdlib=libc++a la línea de comando CE, obtendrá:

-120 120
10 10
10
10
Marshall Clow
fuente