Подписанный целочисленный переполнение в C ++ является неопределенным поведением < /li>
Постоянные выражения не позволяют содержать неопределенное поведение. />
Код: Выделить всё
template struct S { };
template
S f()
{
return S();
}
int main(int, char **)
{
f();
return 0;
}
< /code>
Однако теперь я пробую следующее: < /p>
#include
template struct S { };
template
S g()
{
return S();
}
int main(int, char **)
{
g();
return 0;
}
< /code>
Каждый из G ++, Clang и MSVC с радостью составьте это, несмотря на то, что < /p>
Поведение не определена, если | m |, | n | или наименьшее количество кратных
| m | и | n | не представлен как значение типа
std::common_type_t
( источник: https://en.cppreference.com/w/cpp/numeric/lcm)
это ошибка во всех трех компиляторах? Или Cppreference неправильно, что поведение LCM не определена, если оно не может представлять результат?
Подробнее здесь: https://stackoverflow.com/questions/724 ... mpiler-bug