2012-02-28 27 views
18

Giả sử tôi sử dụng lambda làm hàm gọi lại và khi tạo lambda, tôi nắm bắt biến hàm cục bộ theo tham chiếu. Bây giờ giả sử rằng đối tượng lambda không được thực hiện cho đến sau khi biến hàm cục bộ đó nằm ngoài phạm vi. Chuyện gì xảy ra?Điều gì xảy ra nếu tôi nắm bắt biến cục bộ bằng tham chiếu và biến nằm ngoài phạm vi?

Tôi nhận ra rằng sẽ thật ngu ngốc nếu có ai đó làm như vậy nếu có cơ hội xảy ra, nhưng tôi gần như chắc chắn rằng ai đó sẽ làm việc đó.

+0

Tôi không quen với C++ 11 nhưng đối với bất kỳ ngôn ngữ nào khác mà tôi đã sử dụng, việc ghi biến theo định nghĩa có nghĩa là nó không nằm ngoài phạm vi cho đến khi nó được chụp (có bất kỳ [ gián tiếp] tham chiếu đến nó). –

+8

Không có trong C++. Trả về một lambda mà nắm bắt một biến cục bộ bằng tham chiếu có nghĩa là tham chiếu sẽ không còn hợp lệ nữa khi hàm trả về trả về. Hành vi không xác định xảy ra sau đó. –

+0

Các hàm của chúng là tĩnh và do đó luôn luôn hợp lệ. Nhưng một 'void (**)()' * có thể * trở nên lúng túng. Còn gì nữa? –

Trả lời

16

Có, điều đó sẽ tuân theo một tham chiếu lơ lửng. Nghe có vẻ như bạn đang lo lắng về thiết kế giao diện: "Tôi gần như tích cực rằng ai đó sẽ kết thúc làm việc đó." Vui lòng không từ chối lambdas và std::function trên cơ sở này vì chúng không nguy hiểm hơn bất kỳ phương án thay thế nào khác. Lambdas chỉ là một cách đơn giản hơn để định nghĩa các hàm địa phương. std::function là giao diện tốt nhất để liên tục, các hàm funcacteric, lambda hay không.

Vấn đề phạm vi là lý do tại sao việc thu thập theo giá trị trở nên dễ dàng hơn. Người dùng sẽ không nhận được tham chiếu trừ khi họ viết &. Tất nhiên, nguy hiểm là ai đó sẽ có thói quen bắt đầu tất cả các chức năng lambda của họ với [&], vì tham chiếu là "nhanh hơn". Hy vọng rằng bất kỳ người nào như vậy sẽ học được bài học của họ sớm đủ ... mặc dù một số con trỏ hạnh phúc chỉ là không đủ điều kiện.

12

Điều tương tự cũng xảy ra khi bạn trả về tham chiếu đến biến cục bộ: hành vi không xác định.

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