Согласно [это Q & A] , поскольку оператор запятой c ++ 11 поддерживает constexpr.Согласно [этим вопросам и ответам] переменная constexpr не должна быть захвачена лямбда-выражением, а должна использоваться внутри ее тела.
Оба эти правила делают следующий код, компилируемый в clang:
//Example 1
template <int>
struct Foo {};
int main() {
constexpr int c = 1;
static_cast<void>(Foo<(c, 2)>{});
}
//Example 2
template <int>
struct Foo {};
int main() {
constexpr int c = 1;
auto lambda = []{return c * 2;};
static_cast<void>(Foo<lambda()>{});
}
Однако, хотя оба этих примера успешно компилируются в clang (который объявляет поддержку lambda constexpr, то есть - 8.0.0), следующий фрагмент не работает, и я не могу представить, почему ... Любые идеи?
template <int>
struct Foo {};
int main() {
constexpr int c = 1;
auto lambda = []{return (c, 2);};
static_cast<void>(Foo<lambda()>{});
}
Ошибка компиляции:
переменная 'c' не может быть неявно захвачена в лямбда-выражении без указания захвата по умолчанию
[live демо]