Я сталкивался с таким поведением, 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
должны дать 10
, поскольку все предварительные условия выполнены.
В частности, требуется только, чтобы абсолютные значения обоих операндов были представлены в их общем типе:
Если либо | m | или | n | не представляется как значение типа
std::common_type_t<M, N>
, поведение не определено.
И все же первый звонок возвращается 2
. Я что-то здесь упускаю? И gcc, и clang ведут себя таким образом.
интересно, что gcc компилирует 2 целых числа, чтобы просто напечатать значение, а целое число, а неподписанное - нет: godbolt.org/z/koEVHh
—
Алан
Что
—
TC
-120 % 10u
? (Подсказка: это не 0.) Да, ошибка.
@TC Да, приведение
—
Дэйва
-120
к unsigned
приведет к тому, 4294967176
что % 10u
есть 6
. Мой вопрос был скорее, если это поведение действительно неверно, что кажется.
@AlanBirtles В этом случае Ther не будет приведения к
—
Дэйв
unsigned
, так не ошибки либо