std::ref, std::cref
Материал из cppreference.com
< cpp | utility | functional
Определено в заголовочном файле <functional> | ||
(1) | ||
template<class T > std::reference_wrapper<T> ref( T& t )noexcept; | (начиная с C++11) (до C++20) | |
template<class T > constexprstd::reference_wrapper<T> ref( T& t )noexcept; | (начиная с C++20) | |
(2) | ||
template<class T > ref(std::reference_wrapper<T> t )noexcept; | (начиная с C++11) (до C++20) | |
template<class T > constexprstd::reference_wrapper<T> | (начиная с C++20) | |
template<class T > void ref(const T&&)= delete; | (3) | (начиная с C++11) |
(4) | ||
template<class T > std::reference_wrapper<const T> cref(const T& t )noexcept; | (начиная с C++11) (до C++20) | |
template<class T > constexprstd::reference_wrapper<const T> cref(const T& t )noexcept; | (начиная с C++20) | |
(5) | ||
template<class T > std::reference_wrapper<const T> | (начиная с C++11) (до C++20) | |
template<class T > constexprstd::reference_wrapper<const T> | (начиная с C++20) | |
template<class T > void cref(const T&&)= delete; | (6) | (начиная с C++11) |
Шаблоны функций ref
и cref
это вспомогательные функции, которые генерируют объект типа std::reference_wrapper, используя вывод аргументов шаблона для определения аргумента шаблона результата.
| (начиная с C++20) |
Содержание |
[править]Параметры
t | — | ссылка lvalue на объект, который необходимо обернуть, или экземпляр std::reference_wrapper |
[править]Возвращаемое значение
1)std::reference_wrapper<T>(t)
2)t
4)std::reference_wrapper<const T>(t)
5)t
3,6) оболочка ссылки rvalue удалена.
[править]Пример
Запустить этот код
#include <functional>#include <iostream> void f(int& n1, int& n2, constint& n3){std::cout<<"В функции: "<< n1 <<' '<< n2 <<' '<< n3 <<'\n';++n1;// инкрементирует копию n1, хранящуюся в функциональном объекте++n2;// инкрементирует n2 функции main()// ++n3; // ошибка компиляции} 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<<"Перед функцией: "<< n1 <<' '<< n2 <<' '<< n3 <<'\n'; bound_f();std::cout<<"После функции: "<< n1 <<' '<< n2 <<' '<< n3 <<'\n';}
Вывод:
Перед функцией: 10 11 12 В функции: 1 11 12 После функции: 10 12 12
[править]Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 3146 | C++11 | развёртка перегрузок иногда приводила к ошибке | сделано всегда правильной |
[править]Смотрите также
(C++11) | обёртка ссылок CopyConstructible и CopyAssignable (шаблон класса) |