Modern C++

[C++] Universal Reference

태현123 2021. 9. 27. 22:06
728x90
반응형
SMALL

오늘 알아볼 내용은 Universal Reference이다.

 

지난번에는 R Value Reference에 대해서 공부했다. L Value는 저장되고 있는 값이고, R Value는 저장되지 않는 임시적인 값을 의미하고, 대표적인 예로는 상수, 함수의 리턴 값이 있다. 이런 R Value의 Reference는 &&연산자를 사용하여 참조하는데, C++ 11에서 약간 특이한 사항으로 R Value인지 L Value인지 추론을 해야 하는 경우가 생긴다. 이런 특이한 reference를 Universal Reference라고 부른다. 만약 추론을 할 필요가 없을 경우, &&는 그냥 R Value Reference라고 볼 수 있다.

 

Universal Reference를 이용하려면 타입의 추론이 있어야 한다고 했다. 그럼 어떤 경우에 Universal Reference를 이용하는지 살펴보자

 

1. Template를 사용할 경우

template <typename T>
void function(T&& p)

-- 이 때 p의 타입은 추론 되어야만 한다. T를 추론해야 할 경우 T&&은 Universal Reference가 된다.

 

2. auto를 사용할 경우

int var1 = 0;

auto&& var2 = var1 ;

-- 이 때 var2의 타입은 추론되어야 한다. 그러므로 auto&&도 Universal Reference가 된다.

 

-- 그렇다고, 타입 추론을 하는 경우는 모두 Universal Reference는 아니다.

template <typename T>

const T&&의 경우 R Value Reference로 취급된다.

오류 발생.

function에서 const를 붙여주니 빨간줄이 난다. 인자 값이 L Value이기 떄문이다. 만약 R Value라면?

 

오류 안발생

아무 문제 없다. const를 붙여주면 R Value Reference로 동작한다.

const를 안붙인경우

const를 안 붙인경우, Universal Reference이기 때문에 빨간 줄이 없다.

이 외에도 좀 여러가지 경우가 있는데, 직접 코드를 짜보면 어떻게 되는지 좀 더 이해하는데 도움이 될 것 같다.

 

정리

1. &&를 붙인다고 모두 R Value Reference가 아니다. 이는 가끔 R Value, L Value 를 추론해줘야만 할 경우가 있다.

2. 1번에서 말하는 추론을 해줘야 하는 경우, Universal Reference라고 부른다.

3. 이는 주로, template, auto와 같은 제네릭에서 발생하는 것 같다. ->> 제 추론입니당.. 아니면 댓글달아주세용..

 

반응형
LIST

'Modern C++' 카테고리의 다른 글

[C++] Thread  (0) 2021.09.20
[C++] R Value 참조와 Move Semantics  (0) 2021.09.11
[C++] Priority Queue - 우선순위 큐  (0) 2021.08.19
[C++] Iterator  (0) 2021.08.16
[C++] 상속  (0) 2021.08.15