Пространства имён
Варианты
Действия

std::ref, std::cref

Материал из cppreference.com
< cpp‎ | utility‎ | functional
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Объекты функции
Функции обёртки
(C++11)
(C++11)
Применение частичных функций
(C++20)(C++23)
(C++11)
Вызов функции
(C++17)(C++23)
Объект идентичности функции
(C++20)
Обёртки ссылок
refcref
(C++11)(C++11)
Прозрачные обёртки операторов
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
Отрицатели
(C++17)
Искатели
Ограниченные компараторы
Старые привязки и адаптеры
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
(до C++17*)(до C++17*)
(до C++17*)(до C++17*)

(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
 
Определено в заголовочном файле <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 >

std::reference_wrapper<T>

    ref(std::reference_wrapper<T> t )noexcept;
(начиная с C++11)
(до C++20)
template<class T >

constexprstd::reference_wrapper<T>

    ref(std::reference_wrapper<T> t )noexcept;
(начиная с 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>

    cref(std::reference_wrapper<T> t )noexcept;
(начиная с C++11)
(до C++20)
template<class T >

constexprstd::reference_wrapper<const T>

    cref(std::reference_wrapper<T> t )noexcept;
(начиная с C++20)
template<class T >
void cref(const T&&)= delete;
(6) (начиная с C++11)

Шаблоны функций ref и cref это вспомогательные функции, которые генерируют объект типа std::reference_wrapper, используя вывод аргументов шаблона для определения аргумента шаблона результата.

T может быть неполным типом.

(начиная с C++20)

Содержание

[править]Параметры

t ссылка lvalue на объект, который необходимо обернуть, или экземпляр std::reference_wrapper

[править]Возвращаемое значение

2)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 развёртка перегрузок иногда приводила к ошибке сделано всегда правильной

[править]Смотрите также

обёртка ссылок CopyConstructible и CopyAssignable
(шаблон класса)[править]
close