c++ - 这是 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 都以这种方式运行。
解决方案
看起来像 libstc++ 中的一个错误。如果你添加-stdlib=libc++
到 CE 命令行,你会得到:
-120 120
10 10
10
10
推荐阅读
- android - 为什么 setPivotX() 只是替换视图?
- unity3d - 将 .NET 4.5 C# DLL 加载到 Unity 2018.2.5 后的 TypeLoadException
- c++ - 我想在 C++ 中读取一些多个字符,但它从不读取第二个字符
- javascript - 如果行中带有值触发器的任何单元格被更新,sendNotification 将继续发送电子邮件
- service - 如何检查由 NSSM(非吸吮服务管理器)创建的所有服务的列表?
- reactjs - 使用 React / Redux Forms 覆盖 onChange 行为
- python - 用单个列表(作为键)映射多个列表(作为值)以在 python 中创建字典
- sql - SQL 中的家庭记录
- javascript - setInterval 在页面更改后运行
- python-3.x - 如何在执行时在 Singularity 容器中设置 Python 别名?