Lý do [&this]không hoạt động là vì nó là một lỗi cú pháp. Mỗi tham số được phân tách bằng dấu phẩy trong lambda-introducerlà capture:
capture:
identifier
& identifier
this
Bạn có thể thấy điều đó &thiskhông được phép về mặt cú pháp. Lý do nó không được phép là bởi vì bạn sẽ không bao giờ muốn nắm bắt thisbằng tham chiếu, vì nó là một con trỏ const nhỏ. Bạn sẽ chỉ muốn chuyển nó theo giá trị - vì vậy ngôn ngữ chỉ không hỗ trợ nắm bắt thisbằng cách tham chiếu.
Để nắm bắt thisrõ ràng, bạn có thể sử dụng [this]như lambda-introducer.
Đầu tiên capturecó thể là một capture-defaultđó là:
capture-default:
&
=
Điều này có nghĩa là nắm bắt tự động bất kỳ thứ gì tôi sử dụng, theo tham chiếu ( &) hoặc theo giá trị ( =) tương ứng - tuy nhiên cách xử lý thislà đặc biệt - trong cả hai trường hợp, nó được ghi lại theo giá trị vì những lý do đã đưa ra trước đó (ngay cả với việc nắm bắt mặc định &, thường có nghĩa là nắm bắt bằng cách tham khảo).
5.1.2.7/8:
Với mục đích tra cứu tên (3.4), xác định kiểu và giá trị của this(9.3.2) và chuyển đổi biểu thức id tham chiếu đến các thành viên lớp không tĩnh thành các biểu thức truy cập thành viên lớp bằng cách sử dụng (*this)(9.3.1), câu lệnh ghép [OF THE LAMBDA] được xem xét trong ngữ cảnh của biểu thức lambda.
Vì vậy, lambda hoạt động như thể nó là một phần của hàm thành viên bao quanh khi sử dụng tên thành viên (như trong ví dụ của bạn về việc sử dụng tên x), vì vậy nó sẽ tạo ra "tập quán ngầm" thisgiống như một hàm thành viên.
Nếu một lambda-capture bao gồm một capture mặc định &, thì các số nhận dạng trong lambda-capture sẽ không được đặt trước &. Nếu một lambda-capture có chứa mặc định là =capture, lambda-capture sẽ không chứa
thisvà mỗi định danh mà nó chứa sẽ được đặt trước &. Một số nhận dạng hoặc thissẽ không xuất hiện nhiều hơn một lần trong quá trình chụp lambda.
Vì vậy, bạn có thể sử dụng [this], [&], [=]hoặc [&,this]như một lambda-introducerđể nắm bắt những thiscon trỏ theo giá trị.
Tuy nhiên [&this]và [=, this]được hình thành xấu. Trong trường hợp cuối cùng, gcc tha thứ cảnh báo [=,this]điều đó explicit by-copy capture of ‘this’ redundant with by-copy capture defaulthơn là lỗi.
thiskhông thể thay đổi, nó không đủ lớn để tạo tham chiếu nhanh hơn ... và dù sao , nó không thực sự tồn tại , vì vậy nó có không có thời gian tồn tại thực, có nghĩa là mọi tham chiếu đến nó sẽ bị treo lơ lửng theo định nghĩa.thislà prvalue, không phải lvalue.