Ben std::gcd
beklenmedik buldum bu davranış karşılaştım :
#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;
}
Cppreference göre tüm önkoşullar karşılandığı için her iki çağrı da std::gcd
vermelidir 10
.
Özellikle, sadece her iki işlenenin mutlak değerlerinin ortak türlerinde temsil edilebilir olması gerekir:
İkisinden biri | m | veya | n | bir tür değeri olarak temsil edilemez
std::common_type_t<M, N>
, davranış tanımsızdır.
Yine de ilk çağrı geri döner 2
. Burada bir şey mi eksik? Hem gcc hem de clang bu şekilde davranır.
ilginç bir şekilde gcc sadece değeri yazdırmak için 2 ints derler, ancak int ve imzasız değil: godbolt.org/z/koEVHh
—
Alan Birtles
Nedir
—
TC
-120 % 10u
? (İpucu: 0 değil.) Evet, hata.
@TC Evet, döküm
—
dave
-120
için unsigned
sonuçlanacaktır 4294967176
hangi % 10u
olduğu 6
. Benim sorum daha ziyade, bu davranış gerçekten yanlışsa, öyle görünüyor.
@AlanBirtles Bu durumda, herhangi bir oyuncu olmayacak
—
dave
unsigned
, bu yüzden de hata yok
Olarak bildirildi gcc.gnu.org/bugzilla/show_bug.cgi?id=92978
—
TC