From 187b0594209a8175d5ca0105c0c88d590e58fc5d Mon Sep 17 00:00:00 2001 From: Farsan Rashid Date: Mon, 9 Mar 2020 01:02:02 +0600 Subject: [PATCH] Add new library feature std::ref (#80) * Add std::ref Add missing library feature introduced in CPP11. * Modify comment in example of std::ref * Add comment in example of std::ref * Add link in table of content * Add new library feature std::ref under CPP11 * Add std::cref * Add std::cref --- CPP11.md | 18 ++++++++++++++++++ README.md | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/CPP11.md b/CPP11.md index a12207c..88c3e42 100644 --- a/CPP11.md +++ b/CPP11.md @@ -48,6 +48,7 @@ C++11 includes the following new library features: - [std::array](#stdarray) - [unordered containers](#unordered-containers) - [std::make_shared](#stdmake_shared) +- [std::ref](#stdref) - [memory model](#memory-model) - [std::async](#stdasync) - [std::begin/end](#stdbeginend) @@ -869,6 +870,23 @@ foo(std::make_shared(), function_that_throws(), std::make_shared()); See the section on [smart pointers](#smart-pointers) for more information on `std::unique_ptr` and `std::shared_ptr`. +### std::ref +`std::ref(val)` is used to create object of type `std::reference_wrapper` that holds reference of val. Used in cases when usual reference passing using `&` does not compile or `&` is dropped due to type deduction. `std::cref` is similar but created reference wrapper holds a const reference to val. + +```c++ +// create a container to store reference of objects. +auto val = 99; +auto _ref = std::ref(val); +_ref++; +auto _cref = std::cref(val); +//_cref++; does not compile +std::vector>vec; // vectorvec does not compile +vec.push_back(_ref); // vec.push_back(&i) does not compile +cout << val << endl; // prints 100 +cout << vec[0] << endl; // prints 100 +cout << _cref; // prints 100 +``` + ### Memory model C++11 introduces a memory model for C++, which means library support for threading and atomic operations. Some of these operations include (but aren't limited to) atomic loads/stores, compare-and-swap, atomic flags, promises, futures, locks, and condition variables. diff --git a/README.md b/README.md index ddc80a9..e8233c2 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,7 @@ C++11 includes the following new library features: - [std::array](#stdarray) - [unordered containers](#unordered-containers) - [std::make_shared](#stdmake_shared) +- [std::ref](#stdref) - [memory model](#memory-model) - [std::async](#stdasync) - [std::begin/end](#stdbeginend) @@ -1975,6 +1976,23 @@ foo(std::make_shared(), function_that_throws(), std::make_shared()); See the section on [smart pointers](#smart-pointers) for more information on `std::unique_ptr` and `std::shared_ptr`. +### std::ref +`std::ref(val)` is used to create object of type `std::reference_wrapper` that holds reference of val. Used in cases when usual reference passing using `&` does not compile or `&` is dropped due to type deduction. `std::cref` is similar but created reference wrapper holds a const reference to val. + +```c++ +// create a container to store reference of objects. +auto val = 99; +auto _ref = std::ref(val); +_ref++; +auto _cref = std::cref(val); +//_cref++; does not compile +std::vector>vec; // vectorvec does not compile +vec.push_back(_ref); // vec.push_back(&i) does not compile +cout << val << endl; // prints 100 +cout << vec[0] << endl; // prints 100 +cout << _cref; // prints 100 +``` + ### Memory model C++11 introduces a memory model for C++, which means library support for threading and atomic operations. Some of these operations include (but aren't limited to) atomic loads/stores, compare-and-swap, atomic flags, promises, futures, locks, and condition variables.