Home Dashboard Directory Help

Reference capture by inner lambda of by-value captured variable of non-mutable outer lambda causes weird compiler error by c9xeo


 as Fixed Help for as Fixed

Sign in
to vote
Type: Bug
ID: 730244
Opened: 3/10/2012 9:23:41 AM
Access Restriction: Public
Moderator Decision: Sent to Engineering Team for consideration
User(s) can reproduce this bug


This code

int main()
    int i = 0;
     [&]{ int j = i; };

triggers the following error:

error C2440: '<function-style-cast>' : cannot convert from 'const int' to '`anonymous-namespace'::<lambda1>'
         No constructor could take the source type, or constructor overload resolution was ambiguous

The following changes make the code compile as expected:
- mark the outer lambda 'mutable'
- capture 'i' by reference in the outer lambda
- remove the 'int j = i;' in the inner lambda
- capture everything by value in the inner lambda
Presumably just capturing 'i' by value in the inner lambda would work too, but I can't test that because of https://connect.microsoft.com/VisualStudio/feedback/details/725134 not being fixed in VS11 Beta. This bug may be related to the aforementioned one, as inner lambdas seem to search the outer function block scope, and not the lambda block scope for captures.
Sign in to post a comment.
Posted by Microsoft on 3/18/2012 at 3:07 PM

Thank you for your bug report. This is already fixed in the next version of the VC++ compiler, you may try it out using currently available VS11 Beta.

Ulzii Luvsanbat
Visual C++ Team
Posted by MS-Moderator09 [Feedback Moderator] on 3/12/2012 at 1:24 AM
Thanks for your feedback. We are routing this issue to the appropriate group within the Visual Studio Product Team for triage and resolution. These specialized experts will follow-up with your issue.Thank you !
Posted by MS-Moderator01 on 3/10/2012 at 9:53 AM
Thank you for your feedback, we are currently reviewing the issue you have submitted. If this issue is urgent, please contact support directly(http://support.microsoft.com)
Sign in to post a workaround.