2011-01-05 7 views
6

Koenig 조회의 근거는 무엇입니까?Koenig 조회에 대한 이론적 근거

코드를 읽기가 더 어렵게 만드는 등의 생각을 피할 수는 없습니다. 불안정한.

특정 사례 (예 : 비회원 운영자) 또는 명시 적으로 필요한 경우에만 작동하도록 Koenig 조회를 정의 할 수 있습니까?

+0

생각하지 마세요. 그래서 나는 그것을 알고 싶다. 좋은 질문! – Nawaz

답변

5

원래의 동기 부여, IIRC는 명시 적으로 std::operator<<(std::ostream&, int)을 한정하지 않고

std::cout << 42; 

을 쓸 수 있었다.

인수 종속 조회를 사용하지 않으려면 명시 적으로 함수 이름을 정규화 할 수 있습니다. swap 대신 std::swap을 사용하여 swap이 해당 인수가 존재하는 모든 네임 스페이스에서 조회되지 않도록하십시오.

ADL을 SFINAE와 함께 사용하면 컴파일 타임에 특정 함수가 특정 유형에 대해 정의되었는지 여부를 테스트 할 수 있습니다.이 함수를 연습으로 사용하도록 설정했는지 여부는 Stackoverflow에서 확인할 수 있습니다.

+0

나는 SFINAE가 ADL이 도입 된 이후에 잉태되었다고 생각합니다. 어쨌든 요점은 내가 명시 적으로 네임 스페이스를 사용하도록 (또는 ADL을 명시 적으로 말하도록) 강요 받고 싶다는 것입니다. ... 나는 C++을 사용하지 않는 내 친구에게 쓴 코드를 설명했다. 10 분 동안 네임 스페이스에 관해 이야기 한 후에 그는 코드 조각에서 다른 네임 스페이스의 함수를 명시 적으로 사용하지 않고 사용할 수있는 이유를 묻습니다."C++은 또 다른 규칙을 가지고 있기 때문에 나는"오, 음, 그래. "라고 생각했다. – peoro

+0

@peoro : C++에는 이상한 규칙들이 많이 있는데, C++ 0x에서는이 규칙이 더 나 빠질 것이다. 그러나 ADL은 멤버 함수를 명시 적으로 'this->'로 호출하고 의미가있을 때마다 명시 적 자격을 사용하는 것이 가장 좋습니다. 대부분의 경우 멤버 함수 호출을 제외하고는이 작업이 필요하지 않습니다. 그리고 ADL이 좋은 때가 있습니다. –

+0

@Alexandre C .: 그렇습니다. 그런 식으로 피할 수는 있지만, ADL이 존재하는 이유에 대해서는 대답하지 않습니다. 나는 (이것이 나의 개인 견해이다, 네) 생각했다. 그것은 그것을 가지지 않고 더 단순하고 청결 하여서 그것을 피할 수밖에 없었다. 어떤 경우에 좋을까요? 지금은 좋은 구문을 가진 언어로 쉽게 피할 수있는 C++의 이상한 규칙처럼 보입니다. – peoro

3

ADL의 가장 강력한 사용 사례는 이와 같은 경우입니다.

namespace A 
{ 
    struct S {}; 
    S operator+(const S&, const S&); 
} 

namespace B 
{ 
    A::S test() 
    { 
     A::S a, b; 
     return a + b; 
    } 
} 

그것은 또한 단지 operator 함수에 적용해서는 안 일반적인 코드의 올바른 swap 기능을 선택하는 데 유용합니다. 그것은 이미 표준의 꽤 복잡한 부분이며, 어떤 경우에는 작동하지 못하게하는 규칙을 만들면 더 복잡해질 것이며, 이득은 무엇입니까?

다른 네임 스페이스의 함수를 직접 호출하는 것보다 훨씬 덜 장황한 명시 적으로 요구하는 깔끔한 방법을 생각할 수 없으며, 어쨌든 식을 더 복잡하게 만듭니다.

다음과 같이 생각하고 있습니다. return [[ use_adl ]] (a + b);return A::operator+(a, b);?

+0

사실 나는 koenig lookup을 사용하는 함수 안에 어떤 종류의 키워드를 추가하려고합니다 :'void f (const T & a) {namespaceof (T) :: ...; }'... – peoro

+2

@peroro :'namespaceof (T)'는 당신이 검색 할 특정 네임 스페이스를 지정하는 것처럼 들립니다. 이 경우 ADL은 전혀 필요하지 않습니다. 자격있는 ID를 사용할 수도 있습니다. –

+0

@Charles Bailey : 네,하지만 제 질문은 아직 있습니다. 컴파일러와 표준을 위해 더 간단하고 (프로그래머와 표준을 위해) ADL 대신에'namespaceof'와 같은 연산자를 사용하고 명시 적으로 네임 스페이스를 사용하도록 강요되지 않을까요? – peoro

관련 문제