2017-01-16 7 views
1

C++에서 함수 선언 범위와 관련하여 질문이 있습니다. #include <cmath>을 사용하면 전역 네임 스페이스에 함수 기호가 도입된다고 가정하십시오. 내 이해에 따르면 원칙적으로 심볼은 std 네임 스페이스에만 삽입해야하지만 실제로는 내 경험에 따라 일부 심볼이 전역 네임 스페이스에 표시됩니다. 이 대답은 이것을 확인한 것 같습니다 : cmath header confusion.C++ 전역 이름 공간의 함수와 같은 이름의 네임 스페이스에서 함수 선언

namespace foo { } 안에 함수 (전역 네임 스페이스의 함수와 동일한 프로토 타입)를 선언하면 어떻게됩니까? <cmath>에서 sqrt() 글로벌 네임 스페이스에서 끝나는, 예를 들어 가정, 나는이 : 템플릿이 글로벌 네임 스페이스의 하나와 충돌한다처럼 보인다 기호 double sqrt(double x)에 해결

#include <cmath> 

namespace foo { 

    template <class T> 
    T sqrt(T x) { 
     // do something extra... 
     return std::sqrt(x); 
    } 

} 

// ... 

void foo::bar() { 
    double a = 4.0; 
    double b = sqrt(a); 
} 

. 작동하는 것처럼 보이지만 일반적으로 나쁜 습관입니까?

더 일반적으로 네임 스페이스 내에서 선언 된 함수가 동일한 네임 스페이스 내부에서 사용될 때 전역 함수보다 우선합니까? 이것은 어떤 식 으로든 C++ 표준을 위반합니까?

답변

2

두 가지 문제가 있습니다.

첫째, 특정 헤더를 가져 오면 전역 네임 스페이스와 std 네임 스페이스에 심볼이 모두 주입된다는 것은 사실입니다. 이 소시지 제작은 C++의 유산 및 뿌리와 관련이 있습니다. 가능한 적은 고통으로 C++에서 컴파일 가능한 레거시 C 코드를 얻을 수있는 좋은 기회를 얻으려고합니다. 둘째,이다

는 같은 네임 스페이스 내부에서 사용하는 경우

네임 스페이스 내에서 선언 된 함수가 글로벌 기능보다 우선합니다 ... 사실입니까?

맞습니다. 아니요, 그렇지 않습니다

어떤 방식 으로든 C++ 표준을 위반합니까?

사실 C++ 표준은 이것이 어떻게 작동해야하는지 명시 적으로 지정합니다. 네임 스페이스에서 참조를 해석하면 먼저 비즈니스의 첫 번째 순서와 동일한 네임 스페이스가 검색됩니다. 그런 다음 중첩 네임 스페이스의 경우 부모 네임 스페이스. 그런 다음 결국 전역 네임 스페이스.

그런 다음 using namespace은 작업을 복잡하게 만듭니다. 그래서 you should not do that입니다.

마지막으로 흥미로운 것을 만들기 위해 현재 네임 스페이스, 부모 네임 스페이스 또는 글로벌 네임 스페이스가 아닌 동일한 네임 스페이스에있는 함수를 검색하여 모든 규칙을 머리에 맞추는 argument dependent lookup도 있습니다. 함수의 인수

누구도 C++을 단순하게 비난 한 적이 없습니다.

+0

인수 의존적 인 조회를 지적 해 주셔서 감사합니다! 이전에 몰랐던 메커니즘입니다. –