std::ref, std::cref - cppreference.com

From cppreference.com

Defined in header

<functional>

template<classT>std::reference_wrapper<T>ref(T&t)noexcept; (1)(since C++11)
(constexpr since C++20)template<classT>std::reference_wrapper<T>ref(std::reference_wrapper<T>t)noexcept; (2)(since C++11)
(constexpr since C++20)template<classT>voidref(constT&&)=delete; (3)(since C++11)template<classT>std::reference_wrapper<constT>cref(constT&t)noexcept; (4)(since C++11)
(constexpr since C++20)template<classT>std::reference_wrapper<constT>cref(std::reference_wrapper<T>t)noexcept; (5)(since C++11)
(constexpr since C++20)template<classT>voidcref(constT&&)=delete; (6)(since C++11)Function templates ref and cref are helper functions that generate an object of type

std::reference_wrapper

, using

template argument deduction

to determine the template argument of the result.

T may be an incomplete type.

(since C++20)Parameters

Return value

1)std::reference_wrapper<T>(t)

2)t

4)std::reference_wrapper<constT>(t)

5)t

3,6) rvalue reference wrapper is deleted.

Example

Run this code

#include<functional>#include<iostream>voidf(int&n1,int&n2,constint&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}intmain(){intn1=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';}Output:

Before function: 10 11 12 In function: 1 11 12 After function: 10 12 12 Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior

LWG 3146

C++11 unwrapping overloads sometimes led to error made always valid See also