Ответ 1
Clang ставит диагноз по этим пунктам
[stmt.if] (акцент мой)
2 Если оператор if имеет форму if constexpr, значение условия должно быть контекстно-преобразованным константным выражением типа bool; эта форма называется оператором constexpr.
[expr.const]
4 Преобразованное постоянное выражение типа T - это выражение, неявно преобразованное в тип T, где преобразованное выражение является постоянным выражением, а последовательность неявного преобразования содержит только
- интегральные преобразования, кроме сужающих преобразований,
Теперь, когда дело доходит до интегральных преобразований, преобразование в bool
указывается как интегральное преобразование. И оно сужается в самом строгом смысле этого слова, поскольку bool не может представлять все значения типа int
. Так что диагностика не лишена оснований.
Но я думаю, что также вполне разумно учитывать тот факт, что преобразование в bool
обычно предназначается для проверки на "правдивость", и поэтому сужающий характер не должен иметь значения. Похоже, незначительная ошибка в стандарте 1 когда GCC идет по пути здравого смысла, а Clang придерживается сухой буквы закона в самом строгом смысле.