📕 Book/모던C++입문

[모던C++입문] 3.2 네임스페이스와 함수 룩업

테디슨 2021. 7. 10. 22:47

3.2 네임스페이스와 함수 룩업

네임스페이스

struct global {};
namespace c1
{
    struct c1c{};
    namespace c2
    {
        struct c2c {};
        struct cc
        {
            global x;
            c1c y;
            c2c z;
        }
    }
}

struct same {};         //#1
namespace c1
{
    struct same {};     //#2
    namespace c2
    {
        struct same {}; //#3
        struct csame
        {
            ::same x;   //#1
            c1::same y; //#2
            same z;     //#3
        }
    }
}

struct same {};             //#1
namespace c1                //#a
{
    struct same {};         //#2
    namespace c2
    {
        struct same {};     //#3
        namespace c1 {};    //#b
        struct csame
        {
            ::same x;       //#1
            same z;         //#3

            c1::same y;     //오류: c1::c2::c1::same을 참조하려함
            //#b에 의해 숨겨짐 #2의 same을 선언하려면
            ::c1::same y;   //#2
        }
    }
}
  • 자주사용하는 네임스페이스는 using을 사용하여 네임스페이스를 생략할 수 있다.

인수 종속 룩업

  • Argument dependent look-up, ADL
  • Koenig Algorithm
  • 함수 이름 검색을 네임스페이스로 확장하기때문에 네임스페이스 한정자를 사용하지 않아도 됨
  • 다른 네임 스페이스안에 있는 이름을 가져올 떄는 ADL에 종속되지 않음
  • 오버로드가 존재할 수 있는 함수 템플릿의 네임스페이스를 한정하지 말자
  • 이름을 보이게 한정되지 않은 함수를 호출하자
namespace c1
{
    struct s1
    {
        int data;
    };

    void init(s1& s)
    {
        s.data = 0;
    }
}

int main()
{
    c1::s1 ss;
    init(ss);   //c1::init을 하지 않아도 c1:init함수가 호출된다

    std::cout << ss.data << std::endl;

    return 0;
}
반응형