আমি এই আচরণটি 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;
}
সিপ্রিফারেন্স অনুসারে উভয় কলই std::gcd
উত্পন্ন করা উচিত 10
, কারণ সমস্ত পূর্বশর্তগুলি সন্তুষ্ট।
বিশেষত, এটি কেবলমাত্র উভয় অপারেন্ডের পরম মানগুলি তাদের সাধারণ ধরণের ক্ষেত্রে উপস্থাপনযোগ্য:
হয় যদি | মি | বা | এন | প্রকারের মান হিসাবে উপস্থাপনযোগ্য নয়
std::common_type_t<M, N>
, আচরণটি সংজ্ঞায়িত।
তবুও প্রথম কল রিটার্ন করে 2
। আমি কি এখানে কিছু মিস করছি? জিসিসি এবং ঝনঝন উভয়ই এ জাতীয় আচরণ করে।
আকর্ষণীয়ভাবে জিসিসি 2 টি ইন্টিকে সংকলন করে কেবল মানটি মুদ্রণ করে তবে কোনও পূর্বনির্ধারিত
—
অ্যালান
কি
—
টিসি
-120 % 10u
? (ইঙ্গিত: এটি 0 নয়) হ্যাঁ, বাগ।
@TC হ্যাঁ, ভোটদান
—
ডেভ
-120
থেকে unsigned
ফল হবে 4294967176
যা % 10u
হয় 6
। আমার প্রশ্নটি বরং এটি ছিল যদি এই আচরণটি সত্যই ভুল হয়, যা এটি বলে মনে হয়।
@ অ্যালানবার্টলস সে ক্ষেত্রে থের কোনও কাস্ট করা হবে না
—
ডেভ
unsigned
, তাই কোনও বাগও নেই