반응형
C++11 부터 r-value에 대한 참조가 가능하다.
r-value는 &&가 붙게 된다.
r-value 참조를 이용하면 아래와 같은 경우에 대한 모호성을 해결할 수 있다.
#include <stdio.h>
#include <iostream>
using namespace std;
void overloadingTest01(int value)
{
cout << "int value" << endl;
}
void overloadingTest01(int& value)
{
cout << "int& value" << endl;
}
int main(void)
{
int x = 100;
cout << "# 01 Overloading Test int vs int& #" << endl << endl;
overloadingTest01(100); // ok
// overloadingTest01(x); // 모호한 함수
return 0;
}
overloadingTest01은 int 변수와 int& 참조자로 오버로딩 되어있다.
overloadingTest01(100)의 경우는 int가 호출되지만,
overloadingTest01(x)의 경우는 int도 가능하고 int&도 가능하기 때문에 컴파일 에러가 발생한다.
overloadingTest01에 발생한 모호성을 r-value 참조가 해결할 수 있다.
r-value는 상수만 참조 받는다.
#include <stdio.h>
#include <iostream>
using namespace std;
void overloadingTest02(int&& value)
{
cout << "int&& value" << endl;
}
void overloadingTest02(int& value)
{
cout << "int& value" << endl;
}
int main(void)
{
int x = 100;
cout << "# 02 Overloading Test int&& vs int& #" << endl << endl;
overloadingTest02(100); // ok
overloadingTest02(x); // ok
return 0;
}
int → int&&로 변경하여 문제를 해결하였으나, int vs int&&에서는 다시 모호한 함수 호출이 발생한다.
변수를 넣는 경우는 int가 호출되지만, 상수를 넣는 경우는 다시 어떤 함수를 호출해야할지 알 수 없기 때문이다.
#include <stdio.h>
#include <iostream>
using namespace std;
void overloadingTest03(int value)
{
cout << "int value" << endl;
}
void overloadingTest03(int&& value)
{
cout << "int&& value" << endl;
}
int main(void)
{
int x = 100;
cout << "# 03 Overloading Test int vs int&& #" << endl << endl;
overloadingTest03(x); // ok
//overloadingTest03(100); // 모호한 함수
return 0;
}
따라서 오버로딩할 함수가 어떤 경우에 호출되도록 할지 잘 고려해야 한다.
최종 코드는 아래와 같다.
#include <stdio.h>
#include <iostream>
using namespace std;
void overloadingTest01(int value)
{
cout << "int value" << endl;
}
void overloadingTest01(int& value)
{
cout << "int& value" << endl;
}
//////////////////////////////////////////////
void overloadingTest02(int&& value)
{
cout << "int&& value" << endl;
}
void overloadingTest02(int& value)
{
cout << "int& value" << endl;
}
//////////////////////////////////////////////
void overloadingTest03(int value)
{
cout << "int value" << endl;
}
void overloadingTest03(int&& value)
{
cout << "int&& value" << endl;
}
int main(void)
{
int x = 100;
cout << "# 01 Overloading Test int vs int& #" << endl << endl;
overloadingTest01(100); // ok
// overloadingTest01(x); // 모호한 함수
cout << "\n\n# 02 Overloading Test int&& vs int& #" << endl << endl;
overloadingTest02(100); // ok
overloadingTest02(x); // ok
cout << "\n\n# 03 Overloading Test int vs int&& #" << endl << endl;
overloadingTest03(x); // ok
//overloadingTest03(100); // 모호한 함수
return 0;
}
반응형
'개발 > C, C++' 카테고리의 다른 글
C++ - 이동 생성자 (move constructor) (0) | 2021.10.29 |
---|---|
C++ - 임시 객체 (temporary object) (0) | 2021.10.27 |
C++ 스마트 포인터 : unique_ptr (0) | 2021.10.16 |
C++ 스마트 포인터 : weak_ptr (0) | 2021.10.14 |
C++ 스마트 포인터 : shared_ptr (0) | 2021.10.12 |
댓글