In the process of running this check on a large codebase I found a number of limitations, and thought I would pass on my fixes for possible integration upstream:
- Templated function call operators are not supported
- Function object constructors are always used directly in the lambda body, even if their arguments are not captured
- Placeholders with namespace qualifiers (std::placeholders::_1) are not detected
- Lambda arguments should be forwarded to the stored function
- Data members from other classes still get captured with this
- Expressions (as opposed to variables) inside std::ref are not captured properly
- Function object templates sometimes have their template arguments replaced with concrete types
This patch resolves all those issues and adds suitable unit tests.
If desired, I can separate these commits out into 7 separate diffs, but it seemed like it might be easier to evaluate them all at once.
"Captured by reference" and "uses init expression" are not mutually exclusive - that gave rise to item 6 above.