मैं इस व्यवहार से आया 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, इसलिए कोई बग भी नहीं है