我遇到了这种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
什么
—
TC
-120 % 10u
啊 (提示:它不是0。)是的,错误。
@TC是,铸造
—
戴夫
-120
到unsigned
会造成4294967176
其% 10u
是 6
。我的问题是,这种行为是否确实是错误的,似乎是正确的。
@AlanBirtles在那种情况下,ther将不会被强制使用
—
dave
unsigned
,因此也不会发生任何错误