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
работает?