这是 std::gcd 中的错误吗?

Is this a bug in std::gcd?

本文关键字:错误 std gcd 这是      更新时间:2023-10-16

我遇到了这种出乎意料的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;
}

在编译器资源管理器上运行

根据cpp偏好,对std::gcd的两个调用都应该产生10,因为所有前提条件都得到满足。

特别是,只需要两个操作数的绝对值都可以用它们的通用类型表示:

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

然而,第一个电话返回2。 我在这里错过了什么吗? gcc 和 clang 的行为都是这样的。

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

-120 120
10 10
10
10