본문 바로가기
프로그래밍 언어/C++

[C++] ADL (Argument Dependent Lookup)

by 까망 하르방 2025. 3. 9.
반응형

ADL (Argument Dependent Lookup)

• 함수 검색할 때 인자가 포함된 namespace는 자동으로 검색에 포함!
Koening Lookup 라고도 부름

#include <iostream>

namespace Harbang
{
	class Point {};
	void draw(const Point& p) { printf("draw..\n"); }
}

int main()
{
	Harbang::Point pt;

	Harbang::draw(pt); // ok

	draw(pt); // ?? -> ok (ADL)
}



Harbang Namespace 없이도 draw() 호출 가능
이는 ADL로 Point가 포함된 namespace 검색하였기 때문.


Q) namespace 명시하게 하면 분명하고 좋은데
 굳이 ADL 기능이 있는 이유는?
A) namespace 안에 있는 타입에 대해서

 다양한 연산자 재정의 함수를 사용하기 위함

namespace std
{
	class string {};
	void operator+(const string& s1, const string& s2) {}
}

int main()
{
	std::string s1;
	std::string s2;

	// 1)
	operator+(s1, s2); // ok (ADL)

	// 2)
	s1 + s2; 	// ?? -> operator+(s1, s2) -> ok
}

 



std::operator+(s1, s2);와 같이
std:: namespace 명시하지 않더라도 사용할 수 있다.
이는 ADL로 string s1, s2 가 포함된 namespace 검색하였기 때문이다.


연산자 재정의로 「s1 + s2」 → operator+(s1, s2) 형태가 되고
결과적으로 ADL로 namespace 명시할 필요가 없다.

 

 

🔹왜 ADL 문법을 알고 있어야 하나요?

C++ 사용하다보면 「std::」 or using 사용하지 않아도 문제 없는 경우가 있다.
이는 ALD 문법으로 괜찮은 것이다.


ex) std namespace 안에 있는 객체라면 std:: 붙이지 않아도 된다.
 → 가독성을 위해서는 붙이는 것이 좋긴 하다.

 

📌 [C++] 연산자 재정의 (Operator Overloading)

 

[C++] 연산자 재정의 (Operator Overloading)

연산자 재정의 (Operator Overloading)사용자 정의 타입에서 +, - 등 연산자 사용할 수 있는 문법class Point{ int x = 0; int y = 0;public: Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1{ 1, 1 }; Point

zoosso.tistory.com

반응형

댓글