functional_ref

functional_ref (std::ref와 std::cref 함수 템플릿)

refcrefstd::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부터)

refcref 함수 템플릿은 템플릿 인자 추론을 사용해 결과의 템플릿 인자를 결정하고, 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) 복사 생성 및 복사 할당이 가능한 참조 래퍼 (클래스 템플릿)

더 알아보기 (Learn more)

cppreference