"Forwarding References" 혹은 "Universal References"은 C++11에서 도입된 기능으로, 주로 함수 템플릿의 매개변수로 사용되는 형태를 가리키는 용어다.
함수 템플릿으로 전달된 인자를 "원본의 값 카테고리와 레퍼런스 유형을 유지하면서 다른 함수로 전달하는 메커니즘"을 일컷는다.
C++에는 Lvalue와 Rvalue이라는 값 카테고리가 있는데 주요 특징은 다음과 같다.
이때 "Forwarding References"는 이러한 값 카테고리를 유지하면서 인자를 전달하는데 사용된다.
Forwarding Reference의 생성 방법은 다음과 같다.
T&& // Where `T` is a template type parameter
auto&&
"Fowarding References"이 가진 또 다른 특징은, "인자로 전달된 값의 카테고리에 따라 바인딩"이 된다는 것이다.
즉, 다음의 규칙이 성사되는데,
그럼 이것이 어떻게 활용되는지 예시를 보도록 하자.
#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++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 |