これはstd :: gcdのバグですか?


14

私は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とunsignedはそうではありません。godbolt.org
Alan Birtles

なに-120 % 10u?(ヒント:0ではありません。)はい、バグです。
TC

@TCはい、キャスティング-120unsignedになり4294967176% 10uです 6。私の質問はむしろ、この振る舞いが実際に正しくないかどうかでした。
dave

@AlanBirtlesその場合、そこにはキャストされunsignedないため、バグも発生しません
dave

回答:


10

libstc ++のバグのようです。-stdlib=libc++CEコマンドラインに追加すると、次のようになります。

-120 120
10 10
10
10
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.