상세 컨텐츠

본문 제목

[C++11] Forwarding References(Universal References)

C++/Modern C++(11, 14, 17, 20)

by deulee 2023. 8. 28. 15:26

본문

"Forwarding References" 혹은 "Universal References"은 C++11에서 도입된 기능으로, 주로 함수 템플릿의 매개변수로 사용되는 형태를 가리키는 용어다.

 

함수 템플릿으로 전달된 인자를 "원본의 값 카테고리와 레퍼런스 유형을 유지하면서 다른 함수로 전달하는 메커니즘"을 일컷는다.

 

C++에는 Lvalue와 Rvalue이라는 값 카테고리가 있는데 주요 특징은 다음과 같다.

  • Lvalue : 주소를 가질 수 있는 변수나 객체를 의미함. (변수, 포인터)
  • Rvalue : 주소를 가질 수 없는 일시적인 값. (정수 리터럴)

이때 "Forwarding References"는 이러한 값 카테고리를 유지하면서 인자를 전달하는데 사용된다.

 

Forwarding Reference의 생성 방법은 다음과 같다.

T&& // Where `T` is a template type parameter
auto&&

 

"Fowarding References"이 가진 또 다른 특징은, "인자로 전달된 값의 카테고리에 따라 바인딩"이 된다는 것이다.

 

즉, 다음의 규칙이 성사되는데,

  • `T& &` == `T&`
  • `T& &&` == `T&`
  • `T&& &` == `T&`
  • `T&& &&` == `T&&`

그럼 이것이 어떻게 활용되는지 예시를 보도록 하자.

#include <iostream>

// Since C++14 or later:
void f(auto&& t) {
	//...
}

template <typename T>
void f(T&& t)
{
	// ...
}

int x = 0;
f(0); // `T` is `int`, deduces as `f(int &&)` => `f(int&&)`
f(x); // `T` is `int&`, deduces as `f(int& &&)` => `f(int&)`

int& y = 0;
f(y); // `T` is `int&`, deduces as `f(int& &&)` => `f(int&)`

int&& z = 0; // `z` is an lvalue with type `int&&`
f(z); // `T` is `int&`, deduces as `f(int& &&)` => `f(int&)`
f(std::move(z)); // `T` is `int`, deduces as `f(int &&)` => `f(int&&)`
return 0;

위의 예시가 어떤 상황에서 어떻게 타입이 추론되는지 상세하게 나타내고 있다.

 

이렇듯 "Forwarding references"는 주로 함수 템플릿에 사용되며 전달하는 인자의 본래의 값 카테고리를 유지시켜주는 데 중요한 역할을 한다.

'C++ > Modern C++(11, 14, 17, 20)' 카테고리의 다른 글

[C++11] Move Semantics  (0) 2023.08.28
[C++11] Rvalue references  (0) 2023.08.28
[C++11] Variadic templates  (0) 2023.08.28
[C++11] Initializer lists  (0) 2023.08.28
[C++11] Static Assertions  (0) 2023.08.26

관련글 더보기