2013-10-30 12 views
22

Nếu biến kiểu tham chiếu đang được ghi trong lambda theo giá trị, nó có bị bắt bởi tham chiếu hay giá trị không?Trong lambda, tham chiếu được bắt giữ như thế nào theo giá trị

mẫu nhỏ với câu hỏi:

#include <iostream> 

struct Test { 
    int a; 
}; 

void testFunc(const Test &test) { 
    auto a = [=] { 
    // does 'test' is being passed to closure object with copy 
    // or by reference? 
    return test.a; 
    }(); 
    std::cout << a; 
} 

int main() { 
    Test test{1}; 
    testFunc(test); 
} 
+2

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'.) –

+0

Xuất hiện bằng [value] (http://ideone.com/R0HclW). –

+0

@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

Trả lời

19

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ị?

+2

Bất kỳ tham chiếu nào (như phần và số đoạn từ đặc điểm kỹ thuật) cho yêu cầu bồi thường? –

+5

Tôi cho rằng lý do quan trọng là việc ghi lại theo giá trị là có để biến có giá trị miễn là đóng. Mà sẽ không làm việc nếu tài liệu tham khảo đã không bị tước. –

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