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-introducer
là capture
:
capture:
identifier
& identifier
this
Bạn có thể thấy điều đó &this
khô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 this
bằ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 this
bằng cách tham chiếu.
Để nắm bắt this
rõ ràng, bạn có thể sử dụng [this]
như lambda-introducer
.
Đầu tiên capture
có 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ý this
là đặ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" this
giố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
this
và mỗi định danh mà nó chứa sẽ được đặt trước &
. Một số nhận dạng hoặc this
sẽ 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 this
con 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 default
hơn là lỗi.
this
khô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.this
là prvalue, không phải lvalue.