首页 > 解决方案 > 这是 std::gcd 中的错误吗?

问题描述

我遇到了这种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 都以这种方式运行。

标签: c++language-lawyerc++17unsignedlibstdc++

解决方案


看起来像 libstc++ 中的一个错误。如果你添加-stdlib=libc++到 CE 命令行,你会得到:

-120 120
10 10
10
10

推荐阅读