yohjp
yohjp

Reputation: 3125

restriction about default capture mode and 'this' in C++ lambda-expression

I'm wondering why = capture-default mode prohibits this in capture-list of C++ lambda expression.

That is,

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

This is specified by C++11 5.1.2/8.

  • If a lambda-capture includes a capture-default that is &, the identifiers in the lambda-capture shall not be preceded by &.
  • If a lambda-capture includes a capture-default that is =, the lambda-capture shall not contain this and each identifier it contains shall be preceded by &.

Q: Is there any reason or background story for this rule?

Upvotes: 12

Views: 3756

Answers (1)

Jesse Good
Jesse Good

Reputation: 52365

this can only be captured by copy and never by reference. Even if you specify only [&], this can be implicitly captured by copy if odr-used. Therefore, [=, this] is an error because = would already implicitly capture this by copy while the & in [&, this] signifies capture by reference and does not implicitly capture this (unless it is odr-used)

Upvotes: 10

Related Questions