2014-01-14 2 views
2

현재 일반 컨테이너를 다루는 함수 템플릿을 작성하고 있습니다. in this question이라는 이유 때문에 std::begin()std::end()을 사용하고 싶습니다. 내 질문은, 여부를 사용해야합니까 :begin() free 함수 사용 방법

std::begin(myContainer) 

또는 :

using namespace std; // Better use: "using std::begin" 
begin(myContainer) 

또는 다른 말로하면, 그것은 std 네임 스페이스 내에서 begin() 과부하 괜찮습니다? 함수의 사용자가 begin() 함수 을 전역 네임 스페이스에 오버로드하도록 허용해야합니까? STL은 어떻게 처리합니까?

+3

밀접하게 관련 : http://stackoverflow.com/q/18780324/1619294 –

답변

5

using 지시어가 필요하지 않으므로 대신 두 번째 코드 조각에 using 선언이 포함되어 있다고 가정 해 봅시다. 이 기능의 템플릿으로 가서 자신의 컨테이너를 만드는 경우

using std::begin; 

, Container::begin()Container::end() 멤버 함수를 제공하고, 당신이 첫 번째 또는 두 번째 사용 여부 그것은 차이를 만들지 않습니다. std::begin()std::end()은 사용 가능한 경우 해당 멤버 함수를 호출합니다 (§24.7 [iterator.range]).

반면에 컨테이너, 표준 라이브러리 또는 사용자 정의 컨테이너에있는 함수 템플리트를 작성하는 경우, 두 번째 방법을 권하고 싶습니다. 그 무료 기능 컨테이너 정의과 같은 네임 스페이스 내에서 begin()end()에 대한 사용자 정의 과부하를 찾을 수 ADL 수있게됩니다

using std::begin; 
begin(myContainer); 

참고. 오버로드는 네임 스페이스 std 또는 전역 네임 스페이스에 추가하면 안됩니다 (컨테이너 정의가 전역 네임 스페이스에도없는 경우). 이러한 자유 함수 오버로드가없는 경우 std::begin이 호출되며 (using declaration로 인해) Container::begin()이 호출됩니다.

+4

'using namespace std;'보다는'std :: begin;'을 사용하는 것이 더 좋지 않을까요? 후자는 범위에 반갑지 않은 이름을 많이 가져올 수 있습니다. – jogojapan

+0

@jogojapan 와우, 나는 그 라인들을 3-4 번 읽었을 때마다 매번 한 번씩 "std :: begin;"을 사용해서 읽은 다음, 다시 붙잡지 않고 그대로 붙여 넣었다. 그것이보고 싶었던 것을 보는 마음의 경우였던 것 같아요. 그 언급 주셔서 감사합니다; 답변을 업데이트했습니다. – Praetorian

4

std 네임 스페이스에 무언가를 오버로드하는 것은 좋지 않습니다. 특수화 만 허용됩니다. 당신이 ADL을 사용하려면 당신은 당신의 용기에 begin를 호출 할 수 있습니다 실제로 사용자 지정 컨테이너

using std::begin; 
begin(myContainer) 
4

, std::begin를 사용할 수 있습니다. 따라서 MyContainerClass::begin이면 충분합니다. std::end 및 동일 반복기 버전 std::cbeginstd::cend과 동일합니다.