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/CPP14.md b/CPP14.md index 352d953..db17048 100644 --- a/CPP14.md +++ b/CPP14.md @@ -169,7 +169,7 @@ std::chrono::duration_cast(day).count(); // == 1440 ### Compile-time integer sequences The class template `std::integer_sequence` represents a compile-time sequence of integers. There are a few helpers built on top: -* `std::make_integer_sequence` - creates a sequence of `0, ..., N - 1` with type `T`. +* `std::make_integer_sequence` - creates a sequence of `0, ..., N - 1` with type `T`. * `std::index_sequence_for` - converts a template parameter pack into an integer sequence. Convert an array into a tuple: diff --git a/CPP20.md b/CPP20.md index 19980e9..c6cbf84 100644 --- a/CPP20.md +++ b/CPP20.md @@ -333,7 +333,7 @@ After: ```c++ enum class rgba_color_channel { red, green, blue, alpha }; -std::string_view to_string(rgba_color_channel channel) { +std::string_view to_string(rgba_color_channel my_channel) { switch (my_channel) { using enum rgba_color_channel; case red: return "red"; diff --git a/README.md b/README.md index acb5ab8..67491c0 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,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) @@ -425,7 +426,7 @@ After: ```c++ enum class rgba_color_channel { red, green, blue, alpha }; -std::string_view to_string(rgba_color_channel channel) { +std::string_view to_string(rgba_color_channel my_channel) { switch (my_channel) { using enum rgba_color_channel; case red: return "red"; @@ -1163,7 +1164,7 @@ std::chrono::duration_cast(day).count(); // == 1440 ### Compile-time integer sequences The class template `std::integer_sequence` represents a compile-time sequence of integers. There are a few helpers built on top: -* `std::make_integer_sequence` - creates a sequence of `0, ..., N - 1` with type `T`. +* `std::make_integer_sequence` - creates a sequence of `0, ..., N - 1` with type `T`. * `std::index_sequence_for` - converts a template parameter pack into an integer sequence. Convert an array into a tuple: @@ -2012,6 +2013,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.