2011-10-19 26 views
8

Xét đoạn mã sau:Tại sao tôi không chụp được con trỏ "này" bởi một lambda?

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
      { 
       A * a = this; 
       auto functor = [a]() // The compiler won't accept "this" instead of "a" 
        { 
         a->bar(); 
        }; 
      }; 
    } 

    void bar() {} 
}; 

Trong VC2010, sử dụng this thay vì a dẫn đến lỗi biên dịch. Trong số những người khác:

1>main.cpp(20): error C3480: '`anonymous-namespace'::<lambda0>::__this': a lambda capture variable must be from an enclosing function scope 
1>main.cpp(22): error C3493: 'this' cannot be implicitly captured because no default capture mode has been specified 

Điều tôi không hiểu. Nó có nghĩa là nó không biết nếu nó nên sử dụng một tài liệu tham khảo hoặc sao chép nó? Khi cố gắng sử dụng &this để buộc tham khảo, nó cũng nói:

1>main.cpp(20): error C3496: 'this' is always captured by value: '&' ignored 

Các tạm thời mà không phải là khó chịu, nhưng vì lợi ích của sự tò mò, là có một cách để thoát khỏi nó? Điều gì xảy ra khi this được trao cho một lambda?

+2

Hoạt động tốt trong GCC 4.6.1, ngay cả với '[this]'. –

+0

@KerrekSB Tốt để biết ... Cảm ơn bạn đã kiểm tra! – Gabriel

+4

Điều này trông giống như [bug # 560907] (https://connect.microsoft.com/VisualStudio/feedback/details/560907/capturing-variables-in-nested-lambdas) (được đóng là 'WONTFIX', thật không may). –

Trả lời

6

Điều này dường như là lỗi trình biên dịch trong VS2010. Tôi đã có thể làm cho nó hoạt bằng cách cho phép các lambda nội ngầm chụp this:

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
     { 
      auto functor = [=]() 
      { 
       bar(); 
      }; 
     }; 
    } 

    void bar() {} 
}; 

Khi cố gắng sử dụng & này để buộc tham khảo, nó cũng nói:

1> chính. cpp (20): lỗi C3496: 'này' luôn bắt bởi giá trị: '&' phớt lờ

this chỉ có thể được ghi lại theo giá trị. [=][&] đều ghi lại theo giá trị.

Điều gì xảy ra khi điều này được trao cho lambda?

Tôi không biết nhưng nó phải là một cái gì đó đặc biệt vì bạn không thể sử dụng this trong lambda làm con trỏ đến đối tượng lambda. Bất cứ điều gì khác bị bắt trở thành một thành viên riêng của lambda vì vậy có lẽ this cũng vậy nhưng có một số xử lý đặc biệt khi sử dụng.

2

This is a known bug with the Visual Studio 2010 compiler (được tham chiếu bằng nhận xét của Frédéric Hamidi).

Bạn phải chụp rõ ràng this để chuyển nó đến đặc điểm kỹ thuật chụp lamba khác. Điều này cũng áp dụng cho các biến cục bộ được khai báo bên ngoài lambda kèm theo lambda, ngay cả với đặc tả chụp [&].

Các vấn đề liên quan