2011-07-18 4 views
11

for_each는 표준 네임 스페이스에 정의되어 있지만이 코드는 실제로 컴파일되어 다음 컴파일러 플래그로 실행됩니다. 왜 누군가가 설명해 주실 수 있습니까?for_each가 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

조회 ADL -이 사이트에 많은 질문이 있습니다 (인수 종속 조회) – Nim

+0

나는 이식 할 수 없다고 생각하고 있습니다. 당신이 궁금 해서요.하지만'std ::'를 사용하여 안전하다고 제안합니다. –

+0

컴파일러와 표준 라이브러리 구현에서 컴파일되고 실행됩니까? –

답변

15

의견을 대답으로 변환하면이 작동하는 이유는 ADL (Argument Dependent Lookup)입니다. 기본적으로 이것이 의미하는 바는 현재 네임 스페이스에서 for_each에 대한 적절한 일치를 찾지 못하면 컴파일러는 이제 다른 네임 스페이스를 보게되는 기본 규칙을가집니다. 그리고이 이름 공간에 사용되는 네임 스페이스 집합은 다음과 같은 네임 스페이스입니다. 인수들. 네임 스페이스 집합을 가져 오면 적절한 검색 경로 for_each을 검색합니다.

열린 상태의 질문은 std::vector<>::iteratorstd::에 있는지 여부입니다. 확실히 구현에서 그렇습니다. 따라서 for_eachstd::에 있습니다. 일 수 있습니다.이 반복자가 std::에없는 경우 - 안전을 위해 (Alan의 의견과 마찬가지로) 항상 std::으로 예 약하는 습관을 갖습니다.

또한 다른 사람이 다른 사람 for_each을 네임 스페이스에 도입하여 상황을 악화시킬 수있는 경우를 방지합니다 (최악의 경우 시나리오에서는 자동으로 수락하지만 런타임에는 중단됩니다).

+0

답변을 주셔서 감사합니다 –

+0

+1 몇 주 전에 발견했기 때문에 그것은 여전히 ​​나를 놀라게합니다. 추가 : 이러한 기능의 이유 중 하나는 자유 함수 연산자가 네임 스페이스를 지정하지 않고도 작업 할 수 있다는 것입니다. – Klaim

+2

"기본 네임 스페이스에서 일치하는 항목을 찾지 못했습니다"? 나는 ADL이 그렇게 작동한다고 생각하지 않는다. "기본 네임 스페이스"가 연결된 네임 스페이스를 숨길 경우 네임 스페이스에서 오버로드 문제가 발생할 수 있습니다. 어쨌든 기본 네임 스페이스는 무엇입니까? 현재를 의미 했습니까? – MSalters

관련 문제