Bu std :: gcd bir hata mı?


14

Ben std::gcdbeklenmedik buldum bu davranış karşılaştım :

#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;
}

Derleyici gezgininde çalıştır

Cppreference göre tüm önkoşullar karşılandığı için her iki çağrı da std::gcdvermelidir 10.

Özellikle, sadece her iki işlenenin mutlak değerlerinin ortak türlerinde temsil edilebilir olması gerekir:

İkisinden biri | m | veya | n | bir tür değeri olarak temsil edilemez std::common_type_t<M, N>, davranış tanımsızdır.

Yine de ilk çağrı geri döner 2. Burada bir şey mi eksik? Hem gcc hem de clang bu şekilde davranır.


ilginç bir şekilde gcc sadece değeri yazdırmak için 2 ints derler, ancak int ve imzasız değil: godbolt.org/z/koEVHh
Alan Birtles

Nedir -120 % 10u? (İpucu: 0 değil.) Evet, hata.
TC

@TC Evet, döküm -120için unsignedsonuçlanacaktır 4294967176hangi % 10uolduğu 6. Benim sorum daha ziyade, bu davranış gerçekten yanlışsa, öyle görünüyor.
dave

@AlanBirtles Bu durumda, herhangi bir oyuncu olmayacak unsigned, bu yüzden de hata yok
dave

Yanıtlar:


10

Libstc ++ 'da bir hata gibi görünüyor. -stdlib=libc++CE komut satırına eklerseniz şunları elde edersiniz:

-120 120
10 10
10
10
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.