मैं इस व्यवहार से आया 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
, के रूप में सभी पूर्व शर्त संतुष्ट हैं।
विशेष रूप से, यह केवल आवश्यक है कि दोनों ऑपरेंड के पूर्ण मान उनके सामान्य प्रकार में प्रतिनिधित्व करने योग्य हों:
यदि या तो | एम | या | n | प्रकार के मूल्य के रूप में प्रतिनिधित्व करने योग्य नहीं है
std::common_type_t<M, N>
, व्यवहार अपरिभाषित है।
फिर भी पहला कॉल रिटर्न 2
। क्या मुझसे कोई चूक हो रही है? Gcc और clang दोनों इस तरह से व्यवहार करते हैं।
दिलचस्प बात यह है कि 2 ints सिर्फ मूल्य प्रिंट करने के लिए संकलित करता है, लेकिन एक int और अहस्ताक्षरित नहीं करता है: godbolt.org/z/koEVHh
—
एलन
क्या है
—
TC
-120 % 10u
? (संकेत: यह 0. नहीं है) हाँ, बग।
@TC हाँ, कास्टिंग
—
डेव
-120
के लिए unsigned
परिणाम होगा में 4294967176
जो % 10u
है 6
। मेरा प्रश्न यह था कि क्या यह व्यवहार वास्तव में गलत है, जो ऐसा लगता है।
@AlanBirtles उस मामले में, थ्रू कास्ट नहीं किया जाएगा
—
dave
unsigned
, इसलिए कोई बग भी नहीं है