5.2.6. 네임스페이스

템플릿 인스턴스화 중 이름 조회를 수행할 때, 일부 이름은 템플릿 정의 컨텍스트에 있어야 합니다. 다른 이름은 템플릿 인스턴스화 컨텍스트에 있어도 됩니다. 컴파일러는 다음과 같은 두 개의 서로 다른 인스턴스화 조회 알고리즘을 구현합니다.

종속적 이름 조회는 다른 명령 행 옵션에 의해 명시적으로 비활성화되지 않은 경우 또는 종속적 이름 처리가 구성 플래그 또는 명령 행 옵션 중 하나에 의해 활성화되는 경우에 엄격한 모드에서 수행됩니다.

종속적 이름 조회 처리

종속적 이름 조회를 수행하면 컴파일러는 표준에 지정된 인스턴스화 이름 조회 규칙을 구현합니다. 이에 따라 비클래스 프로토타입 인스턴스화가 수행되어야 합니다. 그 다음 표준의 요구조건에 따라 유형 이름과 템플릿 키워드를 사용하여 코드를 작성해야 합니다.

참조 컨텍스트를 사용하는 조회

종속적 이름 조회를 사용하지 않으면 컴파일러는 기존 코드 및 기존 컴파일러와 좀 더 호환되는 방식으로 표준의 2단계 조회 규칙과 유사한 이름 조회 알고리즘을 사용합니다.

이름이 템플릿 인스턴스화의 일부로 조회되지만 인스턴스화의 지역 컨텍스트에 없으면 통합 인스턴스화 컨텍스트에서 조회됩니다. 이 통합 인스턴스화 컨텍스트에는 템플릿 정의 컨텍스트의 이름과 인스턴스화 컨텍스트의 이름이 모두 포함됩니다. 예를 들면 다음과 같습니다.

namespace N
{
    int g(int);
    int x = 0;
    template <class T> struct A
    {
        T f(T t) { return g(t); }
        T f() { return x; }
    };
}

namespace M {
    int x = 99;
    double g(double);
    N::A<int> ai;
    int i = ai.f(0);        // N::A<int>::f(int) calls N::g(int)
    int i2 = ai.f();        // N::A<int>::f() returns 0 (= N::x)
    N::A<double> ad;
    double d = ad.f(0);     // N::A<double>::f(double) calls M::g(double)
    double d2 = ad.f();     // N::A<double>::f() also returns 0 (= N::x)
}

템플릿 인스턴스화에서 이름 조회는 다음과 같은 측면에서 규칙을 따르지 않습니다.

  • 템플릿 정의 컨텍스트의 이름만 함수가 아닌 이름으로 간주되지만, 조회는 템플릿이 정의된 시점에 보이는 이름에만 제한되지 않습니다.

  • 템플릿이 참조된 컨텍스트의 함수는 템플릿의 모든 함수 호출에 대해 고려됩니다. 참조 컨텍스트의 함수는 종속 함수 호출에서만 보입니다.

인수 종속 조회

인수 종속적 조회가 사용 가능하면 인수 종속적 조회를 사용하여 표시되는 함수는 정상 조회에 의해 표시된 함수로 오버로드될 수 있습니다. 표준에 따라 정상 조회로 찾은 이름이 블록 extern 선언이라도 이러한 오버로딩이 발생해야 합니다. 컴파일러는 이 오버로딩을 수행하지만 기본 모드에서 정상 조회로 블록 extern을 찾은 경우 인수 종속적 조회가 수행되지 않습니다.

즉, 프로그램이 네임스페이스를 사용하지 않더라도 컴파일 시 인수 종속적 조회의 사용 여부에 따라 다른 동작을 할 수 있습니다. 예를 들면 다음과 같습니다.

struct A { };
A operator+(A, double);
void f()
{
    A a1;
    A operator+(A, int);
    a1 + 1.0;          // calls operator+(A, double) with arg-dependent lookup
}                      // enabled but otherwise calls operator+(A, int);
Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0348AK
Non-Confidential