这是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应该yield 10,因为满足所有前提条件。

特别是,仅要求两个操作数的绝对值可以以它们的公共类型表示:

如果| m | 或| n | 不能表示为type的值std::common_type_t<M, N>,行为未定义。

但是第一个电话返回2。我在这里想念什么吗?gcc和clang都是这种方式。


有趣的是,gcc编译了2个int以仅打印值,但没有int和unsigned则不打印:godbolt.org/z/koEVHh
Alan Birtles

什么-120 % 10u啊 (提示:它不是0。)是的,错误。
TC

@TC是,铸造-120unsigned会造成4294967176% 10u6。我的问题是,这种行为是否确实是错误的,似乎是正确的。
戴夫

@AlanBirtles在那种情况下,ther将不会被强制使用unsigned,因此也不会发生任何错误
dave

Answers:


10

看起来像libstc ++中的错误。如果添加-stdlib=libc++到CE命令行,您将获得:

-120 120
10 10
10
10
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.