Обертки ссылок

Начиная со стандарта C++11, в заголовочном файле functional доступен шаблонный класс reference_wrapper, реализующий обертку для ссылок. Пример создания объекта, изменения и вывода значения:

// #include <functional>
int x = 5;
std::reference_wrapper<int> ref_x(x);
std::cout << ref_x << std::endl;       // 5
ref_x.get() = 10;
std::cout << ref_x << std::endl;       // 10

Как видно из примера, получить обычную ссылку позволяет метод get().

Для создания экземпляра класса можно также воспользоваться функциями ref() (обычная ссылка) и cref() (константная ссылка):

int x = 5;
std::reference_wrapper<int> ref1 = std::ref(x);
ref1.get() = 10; // OK
std::cout << ref1 << std::endl;       // 10
std::reference_wrapper<const int> ref2 = std::cref(x);
// ref2.get() = 15; // Ошибка!
std::cout << ref2 << std::endl;       // 10

Внутри класса reference_wrapper определен конструктор копирования, оператор присваивания копированием, а также перегружен оператор приведения к типу и оператор (), что позволяет использовать объект в качестве функтора:

int sum(int x, int y) {
   return x + y;
}
// ... Фрагмент опущен ...
auto ref_sum = std::ref(sum);
std::cout << ref_sum(10, 20) << std::endl;       // 30

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов