[모던C++입문] 3.2 네임스페이스와 함수 룩업
- 📕 Book/모던C++입문
- 2021. 7. 10.
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;
}
반응형