Bởi giá trị. Ví dụ compilable:
class C
{
public:
C()
{
i = 0;
}
C(const C & source)
{
std::cout << "Copy ctor called\n";
i = source.i;
}
int i;
};
void test(C & c)
{
c.i = 20;
auto lambda = [=]() mutable {
c.i = 55;
};
lambda();
std::cout << c.i << "\n";
}
int main(int argc, char * argv[])
{
C c;
test(c);
getchar();
}
Kết quả:
Copy ctor called
20
tôi đoán, mà đoạn này của tiêu chuẩn C++ áp dụng:
5.1.2 Lambda biểu thức
(...) 14. Một thực thể được chụp bởi
sao chép nếu nó bị chiếm hoàn toàn và
chụp mặc định là = hoặc nếu rõ ràng là được chụp bằng ảnh chụp không bao gồm &. Đối với mỗi thực thể được chụp bởi bản sao, một thành viên dữ liệu không có tên được khai báo trong loại đóng. Thứ tự khai báo của các thành viên này không được chỉ định. Loại thành viên dữ liệu như vậy là loại đối tượng được ghi tương ứng nếu đối tượng không phải là tham chiếu đối tượng,
hoặc loại được tham chiếu khác. [
Lưu ý: Nếu đối tượng đã chụp là tham chiếu đến hàm , thì thành viên dữ liệu tương ứng cũng là tham chiếu đến hàm. -
lưu ý cuối lưu ý cuối]
Điều đó thực sự có ý nghĩa - nếu biến cục bộ được chuyển bởi giá trị và tham số được chuyển bởi tham chiếu "hành vi" dưới dạng biến cục bộ trong hàm, tại sao nó được chuyển bằng tham chiếu thay vì giá trị?
Vâng, còn thử nghiệm thì sao? (Bạn cần phải sửa đổi đối tượng cho điều đó, có thể đạt được bằng cách thử với tham chiếu không const hoặc bằng cách tạo biến 'mutable'.) –
Xuất hiện bằng [value] (http://ideone.com/R0HclW). –
@JanHudec Có, thử nghiệm là tốt, nhưng nó luôn luôn hữu ích để xem các phần của tiêu chuẩn liên quan và câu trả lời dựa trên lý thuyết (có rất nhiều chuyên gia như vậy trên SO). – Yury