ฉันเจอพฤติกรรมนี้std::gcd
ซึ่งฉันพบว่าไม่คาดคิด:
#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ทั้งการโทรไปยังstd::gcd
ควรผลผลิต10
เป็นปัจจัยพื้นฐานทั้งหมดมีความพึงพอใจ
โดยเฉพาะอย่างยิ่งมันเป็นสิ่งจำเป็นเท่านั้นที่ค่าสัมบูรณ์ของตัวถูกดำเนินการทั้งสองจะเป็นตัวแทนในประเภททั่วไปของพวกเขา:
หาก | m | หรือ | n | ไม่สามารถแทนค่าได้เป็นประเภท
std::common_type_t<M, N>
ซึ่งลักษณะการทำงานนั้นไม่ได้กำหนดไว้
แต่สายแรกกลับ2
มา ฉันทำอะไรบางอย่างหายไปหรือเปล่า ทั้ง gcc และ clang นั้นทำหน้าที่นี้
gcc ที่น่าสนใจรวบรวม 2 int เพียงพิมพ์ค่า แต่ int และผู้ที่ไม่ได้ลงนามไม่ได้: godbolt.org/z/koEVHh
—
Alan Birtles
อะไรนะ
—
TC
-120 % 10u
? (คำแนะนำ: ไม่ใช่ 0) ใช่ข้อผิดพลาด
@TC ใช่หล่อ
—
dave
-120
ไปunsigned
จะส่งผล4294967176
ที่เป็น% 10u
6
คำถามของฉันค่อนข้างหากพฤติกรรมนี้ไม่ถูกต้องซึ่งดูเหมือนว่าจะเป็น
@AlanBirtles ในกรณีที่บิดาจะโยนไปที่ใด
—
dave
unsigned
ดังนั้นข้อผิดพลาดอย่างใดอย่างหนึ่ง
รายงานว่าเป็นgcc.gnu.org/bugzilla/show_bug.cgi?id=92978
—
TC