Your code is valid. §5.1.2/11 goes
An init-capture behaves as if it declares and explicitly captures a variable of the form
“auto
init-capture ;
” whose declarative region is the lambda-expression’s compound-statement […]
Now, clearly, declaring
auto &cap = ci;
and capturing cap
is fine. That is,
int main() {
const int ci = 0;
auto &cap = ci;
auto lambda = [&cap]() { };
}
compiles with GCC. Apart from the declarative region and lifetime of cap
, there is no difference between this snippet and yours, thus GCC is incorrect.
This bug has already been reported as #66735, with a similar example:
int x = 0;
auto l = [&rx = static_cast<const int&>(x)] {};
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…