Ограничение в режиме захвата по умолчанию и 'this' в С++ lambda-expression
Мне интересно, почему =
режим захвата по умолчанию запрещает this
в списке захвата выражения lambda С++.
То есть
[=, this]{ }; // error
[&, this]{ }; // OK
Это указано в С++ 11 5.1.2/8.
- Если lambda-capture включает в себя захват-значение по умолчанию, которое является &, идентификаторам в лямбда-захвате не должно предшествовать &.
- Если лямбда-захват включает в себя захват-значение по умолчанию, равное =, лямбда-захват не должен содержать этого и каждый идентификатор, который он содержит должен предшествовать &.
Q: Есть ли какая-либо причина или предыстория этого правила?
Ответы
Ответ 1
this
может быть захвачен только копией и никогда не по ссылке. Даже если вы укажете только [&]
, this
может быть неявно захвачен копией, если используется odr. Поэтому [=, this]
является ошибкой, потому что =
уже неявно захватывает this
копией, а &
в [&, this]
означает захват по ссылке и не подразумевает захват this
(если только он не используется odr)