Используя предикат в if constexpr
, вы ожидаете, что он безусловно будет константным выражением.Но функция constexpr
может всегда вызываться в контексте non-constexpr с аргументами, которые не являются константными выражениями.Таким образом, параметр функции может никогда не считаться константным выражением.
Поэтому GCC неправильно принимать ваш код без изменений.
Просто так получилось, что ваш конкретный примерне требует if constexpr
для работы в контексте constexpr.Измененная функция:
template <typename Predicate>
constexpr int f(Predicate&& pred) {
if (pred(true)) {
return 1;
}
else {
return 0;
}
}
Вызывается обоими компиляторами , когда требуется постоянное выражение:
int main() {
constexpr int i = f([](auto m) constexpr {
return std::is_same_v<decltype(m), bool>;
});
return i;
}