这是 std::gcd 中的错误吗?
Is this a bug in 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;
}
在编译器资源管理器上运行
根据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
相关文章:
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- C++终止错误'std::bad_alloc'
- 问题创建和返回锯齿状阵列(错误std :: bad_array_new_length)
- 错误:“std::enable_if_t”尚未声明
- 2d 数组运行时错误 "std::bad_alloc()" what()
- C++初始化错误 std::set
- 如何避免编译器错误:std::transform
- 错误:“std”之前的预期初始值设定项
- 如何修复错误'std::promise<int>::promise(const std::promise<int> &)':尝试引用已删除的函数
- 使用我自己的 plus() 函数时出现奇怪的 g++ 编译器错误 ( "std::plus is not a function" )
- C++分段错误std::array
- 如何解决错误 'std::out_of_range' what(): _M_range_check ,向量将接受值,直到被告知中断
- std::wcout奇怪错误:std::wstring的输出被截断
- C++:错误"std::string"是私有的
- 关于ifstream:错误'std::ios_base::ios_base(const std::ios_base&)'是私有的
- C++ 分词器变量中的错误'std::stringstream mystream'具有初始值设定项但类型不完整
- C++ bool std::运算符 < 键映射错误 std::unordered_set<int,std::hash<int>>
- stoi函数在内存位置0x0035E8D8给出错误:std::invalid_argument.c++
- 错误:std::bad_alloc在内存位置0x0038fd50
- 升压单元测试失败,出现错误-std::bad_typeid:Access违规-没有RTTI数据