본문 바로가기
개발/C, C++

C++ - 우측값 참조 r-value reference (기본 자료형)

by 피로물든딸기 2021. 10. 25.
반응형

C, C++ 전체 링크

 

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;
}

반응형

댓글