2011-07-18 44 views
11

Điều tôi nghĩ là for_each được định nghĩa trong không gian tên chuẩn, nhưng mã này thực sự biên dịch và chạy với các cờ trình biên dịch sau đây. Ai đó có thể giải thích tại sao?tại sao for_each hoạt động mà không cần std :: prefix

//@filename myprog.cpp 
    //g++-4.5 --std=c++0x myprog.cpp 

    #include<iostream> 
    #include<algorithm> 

    int main() 
    { 
    std::vector<int> v{1,2,3,4,5}; 
    std::cout<<"printing the number\n"; 
    for_each(v.begin(),v.end(),[](int num) {//no std::for_each 
     std::cout<<num<<"\t"; 
    }); 
return 0; 
} 
+5

tra cứu ADL - có rất nhiều câu hỏi trên trang web này (Truy vấn phụ thuộc đối số) – Nim

+0

Tôi nghĩ điều này sẽ không thể di chuyển được. Tôi biết bạn chỉ tò mò, nhưng tôi đề nghị sử dụng 'std ::' để được an toàn. –

+0

Biên dịch và chạy trên trình biên dịch và thư viện chuẩn nào? –

Trả lời

15

Chuyển đổi nhận xét thành trả lời, lý do hoạt động này là ADL (Tra cứu phụ thuộc đối số). Về cơ bản, điều này có nghĩa là khi không tìm thấy một kết quả phù hợp cho for_each trong không gian tên hiện tại, trình biên dịch có quy tắc được xây dựng trong đó nói, bây giờ nhìn vào các không gian tên khác - và tập các không gian tên mà nó sử dụng cho đây là các không gian tên của các đối số. Một khi nó có một bộ các không gian tên, nó sẽ tìm kiếm thông qua chúng để tìm một for_each phù hợp.

Câu hỏi vẫn mở là liệu std::vector<>::iterator có nằm ở std:: hay không. Rõ ràng trong việc triển khai của bạn, đó là lý do tại sao tìm thấy for_each thích hợp trong số std::. Có có thể là trường hợp mà trình lặp này không có trong std:: - vì vậy để an toàn (như trong nhận xét của Alan), luôn luôn đi vào thói quen đủ điều kiện với std::. Điều này cũng ngăn cản bất kỳ trường hợp nào người khác giới thiệu for_each (vì lợi ích đối số) vào không gian tên của bạn - điều này có thể làm hỏng mọi thứ (trong trường hợp xấu hơn - âm thầm chấp nhận - nhưng bị ngắt tại thời gian chạy).

+0

cảm ơn câu trả lời –

+0

+1 vì tôi đã phát hiện ra nó chỉ vài tuần trước và nó vẫn khiến tôi ngạc nhiên; Ngoài ra: Một trong những lý do cho các tính năng như vậy là cho phép các toán tử miễn phí hoạt động mà không cần phải chỉ định bất kỳ vùng tên nào. – Klaim

+2

"không tìm thấy kết quả phù hợp trong không gian tên mặc định"? Tôi không nghĩ rằng ADL hoạt động như thế. Bạn sẽ có vấn đề với quá tải trên không gian tên nếu "không gian tên mặc định" sẽ ẩn các không gian tên được liên kết. Không gian tên mặc định là gì? Ý bạn là hiện tại? – MSalters

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