This is rejected by g++ (4.9.3 and 5.2.0), but is accepted by clang 3.5.0:
int main() {
const int ci = 0;
auto lambda = [ &cap = ci ]() { };
}
<
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(x)] {};