Если мы используем clang в качестве компилятора, который обычно более актуален, чем gcc, когда речь идет о юристе по языку, мы обнаруживаем, что упрощенный пример очень показателен:
template<typename T>
int foo(T/*&*/ l) {
constexpr auto x = l() - 1;
if constexpr(x <= 0) {
return 42;
}
else {
return 0;
}
}
auto l2 = []{
return 3;
};
int main() {
foo(l2);
}
Добавление и удаление ссылки в foo()
подписи делает программу скомпилированной или некомпилированной. Я полагаю, что это имеет отношение к пункту 12 на тему константного выражения на cppreference:
id-выражение, ссылающееся на переменную или член данных
ссылочный тип , если только он не был инициализирован константным выражением или его время жизни не началось в рамках оценки этого выражения
https://en.cppreference.com/w/cpp/language/constant_expression
Таким образом, оба эти утверждения, по-видимому, не удовлетворены, поскольку ссылка не была инициализирована с помощью константного выражения, и ее время жизни не началось с оценки выражения.