오늘 알아볼 내용은 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를 안 붙인경우, Universal Reference이기 때문에 빨간 줄이 없다.
이 외에도 좀 여러가지 경우가 있는데, 직접 코드를 짜보면 어떻게 되는지 좀 더 이해하는데 도움이 될 것 같다.
정리
1. &&를 붙인다고 모두 R Value Reference가 아니다. 이는 가끔 R Value, L Value 를 추론해줘야만 할 경우가 있다.
2. 1번에서 말하는 추론을 해줘야 하는 경우, Universal Reference라고 부른다.
3. 이는 주로, template, auto와 같은 제네릭에서 발생하는 것 같다. ->> 제 추론입니당.. 아니면 댓글달아주세용..
'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 |