Me he encontrado con este comportamiento std::gcd
que 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::gcd
deben 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.
Curiosamente, gcc compila 2 ints para imprimir el valor, pero un int y un unsigned no: godbolt.org/z/koEVHh
—
Alan Birtles
¿Qué es
—
TC
-120 % 10u
? (Sugerencia: no es 0.) Sí, error.
@TC Sí, enviar
—
Dave
-120
a unsigned
resultará en 4294967176
cuál % 10u
es 6
. Mi pregunta era más bien si este comportamiento es realmente incorrecto, lo que parece ser.
@AlanBirtles En ese caso, no se lanzará
—
dave
unsigned
, por lo que tampoco habrá ningún error
Reportado como gcc.gnu.org/bugzilla/show_bug.cgi?id=92978
—
TC