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
“autoinit-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)] {};