functional_ref
functional_ref (std::ref와 std::cref 함수 템플릿)
ref와 cref는 std::reference_wrapper 객체를 생성하는 헬퍼 함수 템플릿이에요. 템플릿 인자 추론을 통해 결과 타입을 자동으로 결정해 주며, 함수에 인자를 참조로 전달하고 싶을 때 유용해요. 이 페이지에서는 두 함수의 선언과 동작, 예제를 살펴볼게요.
출처: cppreference
본문
함수 템플릿 정의
<functional> 헤더에 정의되어 있어요.
<functional> 헤더에 정의됨 |
||
|---|---|---|
template < class T > std::reference_wrapper<T> ref(T& t) noexcept; |
(1) | (C++11부터) (C++20부터 constexpr) |
template < class T > std::reference_wrapper<T> ref(std::reference_wrapper<T> t) noexcept; |
(2) | (C++11부터) (C++20부터 constexpr) |
template < class T > void ref(const T&&) = delete; |
(3) | (C++11부터) |
template < class T > std::reference_wrapper<const T> cref(const T& t) noexcept; |
(4) | (C++11부터) (C++20부터 constexpr) |
template < class T > std::reference_wrapper<const T> cref(std::reference_wrapper<T> t) noexcept; |
(5) | (C++11부터) (C++20부터 constexpr) |
template < class T > void cref(const T&&) = delete; |
(6) | (C++11부터) |
ref와 cref 함수 템플릿은 템플릿 인자 추론을 사용해 결과의 템플릿 인자를 결정하고, std::reference_wrapper 타입의 객체를 생성하는 헬퍼 함수예요. 오버로드 (3)과 (6)은 rvalue 참조를 받는 경우 삭제되어, 임시 객체를 래핑하는 것을 방지해요.
| T는 불완전한 타입일 수 있어요. | (C++20부터) |
|---|
매개변수
| t | - | 래핑할 객체에 대한 lvalue 참조 또는 std::reference_wrapper 인스턴스 |
|---|
반환값
ref(t)는 std::reference_wrapper<T>(t)를, cref(t)는 std::reference_wrapper<const T>(t)를 반환해요. (2)와 (5)의 오버로드는 전달받은 reference_wrapper를 그대로 다시 감싸서 반환해요.
예제
다음 예제는 std::bind와 함께 ref, cref를 사용하는 방법을 보여줘요.
#include <functional>
#include <iostream>
void f(int& n1, int& n2, const int& n3)
{
std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
++n1; // increments the copy of n1 stored in the function object
++n2; // increments the main()'s n2
// ++n3; // compile error
}
int main()
{
int n1 = 1, n2 = 2, n3 = 3;
std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
n1 = 10;
n2 = 11;
n3 = 12;
std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
bound_f();
std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
}
출력:
Before function: 10 11 12
In function: 1 11 12
After function: 10 12 12
결함 보고
다음 동작 변경 결함 보고서는 이미 발표된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 발표된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3146 | C++11 | 언래핑 오버로드가 때때로 오류를 유발했음 | 항상 유효하도록 수정됨 |
같이 보기
reference_wrapper (C++11) |
복사 생성 및 복사 할당이 가능한 참조 래퍼 (클래스 템플릿) |
|---|