Ответ 1
Какой компилятор прав?
Кланг прав.
Определение constexpr
функции в соответствии с dcl.constexpr/3
Определение функции
constexpr
должно удовлетворять следующим требованиям:
(3.1) его тип возврата должен быть буквальным;
(3.2) каждый из его типов параметров должен быть буквальным типом;
(3.3) его тело-функция должно быть= delete
,= default
или составной оператор, который не содержит:
(3.3.1) определение asm,
(3.3.2) утверждение goto,
(3.3.3) метку идентификатора,
(3.3.4) блок try, или
(3.3.5) определение переменной нелитерального типа или статической или длительности хранения потоков или для которой не выполняется инициализация.
Также согласно dcl.constexpr/5:
Для функции
constexpr
или конструктора constexpr, которая не является ни дефолтом, ни шаблоном, если значения аргументов не существуют, так что вызов функции или конструктора может быть оцененным подвыражением основного константного выражения,
Foo(true)
может быть оценено с помощью выражения константы (т.е. 1
).
Кроме того, Foo(false)
может быть, но не требуется для постоянной оценки.
ЗАКЛЮЧЕНИЕ
Таким образом, ошибка в GCC.
Большое спасибо @Barry, @aschepler и @BenVoigt за помощь в ответе.