Saya menemukan perilaku std::gcd
yang tidak terduga ini:
#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;
}
Jalankan pada compiler explorer
Menurut cppreference, kedua panggilan std::gcd
harus menghasilkan 10
, karena semua prasyarat dipenuhi.
Secara khusus, hanya diperlukan bahwa nilai absolut dari kedua operan diwakili dalam tipe umum mereka:
Jika salah | m | atau | n | tidak dapat direpresentasikan sebagai nilai tipe
std::common_type_t<M, N>
, perilaku tidak terdefinisi.
Namun panggilan pertama kembali 2
. Apakah saya melewatkan sesuatu di sini? Baik gcc dan dentang berperilaku seperti ini.
menariknya gcc mengkompilasi 2 int untuk mencetak nilai tetapi int dan unsigned tidak: godbolt.org/z/koEVHh
—
Alan Birtles
Apa
—
TC
-120 % 10u
? (Petunjuk: ini bukan 0.) Ya, bug.
@TC Ya, casting
—
dave
-120
untuk unsigned
akan menghasilkan 4294967176
yang % 10u
merupakan 6
. Pertanyaan saya adalah lebih tepatnya apakah perilaku ini memang salah, yang sepertinya.
@AlanBirtles Dalam hal ini, tidak akan ada pemain
—
dave
unsigned
, jadi tidak ada bug juga
Dilaporkan sebagai gcc.gnu.org/bugzilla/show_bug.cgi?id=92978
—
TC