template<class A, class B> constexpr int f(A a, B b) {
a /= b;
return a;
}
constexpr int x = f(2, 2); // a, b: int
constexpr int y = f(2., 2.); // a, b: double
constexpr int z = f(2, 2.); // a: int, b: double //<-- BOOM!
constexpr int w = f(2., 2); // a: double, b: int
int main() {}
Код не скомпилирован в clang, он выдает следующую диагностику:
error: constexpr variable 'z' must be initialized by a constant expression
MSVC потерпел крах (согласно godbolt ) и gcc работает нормально.Если a /= b
просто заменить на a = a / b
, то все это принимают.Почему?
Кто прав?Кажется, это связано с неявным сужающим преобразованием, но тогда почему a = a / b
работает?