Подтвердить что ты не робот

Ограничение в режиме захвата по умолчанию и 'this' в С++ lambda-expression

Мне интересно, почему = режим захвата по умолчанию запрещает this в списке захвата выражения lambda С++.

То есть

[=, this]{ };  // error
[&, this]{ };  // OK

Это указано в С++ 11 5.1.2/8.

  • Если lambda-capture включает в себя захват-значение по умолчанию, которое является &, идентификаторам в лямбда-захвате не должно предшествовать &.
  • Если лямбда-захват включает в себя захват-значение по умолчанию, равное =, лямбда-захват не должен содержать этого и каждый идентификатор, который он содержит должен предшествовать &.

Q: Есть ли какая-либо причина или предыстория этого правила?

4b9b3361

Ответ 1

this может быть захвачен только копией и никогда не по ссылке. Даже если вы укажете только [&], this может быть неявно захвачен копией, если используется odr. Поэтому [=, this] является ошибкой, потому что = уже неявно захватывает this копией, а & в [&, this] означает захват по ссылке и не подразумевает захват this (если только он не используется odr)