予期しない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の両方がこのように動作します。
Libstdc ++のバグのようです。 CEコマンドラインに-stdlib=libc++
を追加すると、次のようになります。
-120 120
10 10
10
10