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.
-120 % 10u
? (Sugerencia: no es 0.) Sí, error.-120
aunsigned
resultará en4294967176
cuál% 10u
es6
. Mi pregunta era más bien si este comportamiento es realmente incorrecto, lo que parece ser.unsigned
, por lo que tampoco habrá ningún errorRespuestas:
Parece un error en libstc ++. Si agrega
-stdlib=libc++
a la línea de comando CE, obtendrá:fuente