2013-05-28 38 views
7

Hãy xem xét ví dụ sau:ẩn được biến biến thông qua biến trong lambda. làm thế nào để bỏ ẩn?

int main() 
{ 
    int a = 100; 
    std::cout<<[=,&a](int a,int b){return a+b;}(99,1); 
    return 0; 
} 

Đầu ra là 101 thay vì kỳ vọng của tôi về 100.

Tôi không thể chỉ định như vậy [&a,=] vì lỗi này gây ra lỗi.

Làm cách nào để tránh ẩn tên và tham khảo thông số. tôi biết thay đổi tên là tùy chọn nhưng tôi tò mò. cũng tham khảo tiêu chuẩn sẽ rất hữu ích

EDIT: Tôi đang sử dụng gcc 4.7.1

EDIT:

đây là liên kết ideone thấy bản demo. tôi đã sử dụng C++ 4.7.2 complier có
ideone

+3

Bạn không thể đổi tên ** một đối số và biến cục bộ bên ngoài? –

+1

vâng tôi đã đề cập rằng trong câu hỏi của tôi nhưng tôi tò mò là tại sao có thể được thực hiện? –

+2

'[&, =]' chuyển tất cả các biến theo tham chiếu ** và ** tất cả các biến bằng cách sao chép đồng thời?! Điều đó vô nghĩa đối với tôi. – deepmax

Trả lời

7

Tôi không thể tìm thấy bất kỳ điều gì liên quan đến lambdas trong tiêu chuẩn cho biết kết quả của bạn là hành vi mong đợi. Tôi đồng ý với nhận xét của Andy rằng đây là một lỗi trong GCC. GCC 4.7.2 trên Linux, GCC 4.7.2 từ MinGW và GCC 4.8.0 từ MinGW tạo ra kết quả tương tự như trong câu hỏi nhưng VC++ 10 và VC++ 11 tạo ra kết quả mong đợi.

Bạn nên xem xét filing a bug report

+0

Cảm ơn bạn rất nhiều :) –

1

Làm cách nào để in ra ngoài a tại đây, nhưng trong phạm vi bên trong?

int a = 1; 
{ 
    int a = 2; 
    cout << a << endl; 
} 

Bạn có thể thay đổi tên của một trong các biến - hoặc bạn không.

Cũng vậy với lambda của bạn.

(Tôi xin lỗi mà tôi không thể tham khảo tiêu chuẩn như bạn yêu cầu - Tôi không có nó.)

+0

không thực sự bên ngoài là nhận được in không phải là bên trong. xem câu hỏi. nếu bạn cần làm rõ xin vui lòng cho tôi biết –

+2

Oh - đó là thực sự kỳ lạ. Vì vậy, 'a' được ghi đè sẽ ghi đè tham số' a'. Đó có thể là lỗi trình biên dịch? –

3

Kể từ khi thông số không có một phạm vi mà bạn có thể đặt tên, bạn không thể sử dụng nhà điều hành độ phân giải phạm vi để phân biệt, cũng không phải this hoặc bất kỳ phương tiện nào khác như vậy. Do đó, không thể phân biệt kịch bản này theo cách bạn muốn. Bạn sẽ không phải cung cấp cho các biến của bạn khủng khiếp và xung đột tên.

+0

tôi đồng ý nhưng đây là điều mà tôi đã vô tình gặp phải khi tôi đang gỡ lỗi mã của mình. nhưng ngay cả sau đó tôi tin rằng tham số sẽ ẩn biến đã capture.i đã thay đổi trong mã của tôi nhưng thực sự tò mò. –

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