mirror of
https://github.com/AnthonyCalandra/modern-cpp-features.git
synced 2025-12-17 18:14:36 +03:00
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
This commit is contained in:
18
CPP11.md
18
CPP11.md
@@ -48,6 +48,7 @@ C++11 includes the following new library features:
|
|||||||
- [std::array](#stdarray)
|
- [std::array](#stdarray)
|
||||||
- [unordered containers](#unordered-containers)
|
- [unordered containers](#unordered-containers)
|
||||||
- [std::make_shared](#stdmake_shared)
|
- [std::make_shared](#stdmake_shared)
|
||||||
|
- [std::ref](#stdref)
|
||||||
- [memory model](#memory-model)
|
- [memory model](#memory-model)
|
||||||
- [std::async](#stdasync)
|
- [std::async](#stdasync)
|
||||||
- [std::begin/end](#stdbeginend)
|
- [std::begin/end](#stdbeginend)
|
||||||
@@ -869,6 +870,23 @@ foo(std::make_shared<T>(), function_that_throws(), std::make_shared<T>());
|
|||||||
|
|
||||||
See the section on [smart pointers](#smart-pointers) for more information on `std::unique_ptr` and `std::shared_ptr`.
|
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<std::reference_wrapper<int>>vec; // vector<int&>vec 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
|
### 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.
|
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.
|
||||||
|
|
||||||
|
|||||||
18
README.md
18
README.md
@@ -113,6 +113,7 @@ C++11 includes the following new library features:
|
|||||||
- [std::array](#stdarray)
|
- [std::array](#stdarray)
|
||||||
- [unordered containers](#unordered-containers)
|
- [unordered containers](#unordered-containers)
|
||||||
- [std::make_shared](#stdmake_shared)
|
- [std::make_shared](#stdmake_shared)
|
||||||
|
- [std::ref](#stdref)
|
||||||
- [memory model](#memory-model)
|
- [memory model](#memory-model)
|
||||||
- [std::async](#stdasync)
|
- [std::async](#stdasync)
|
||||||
- [std::begin/end](#stdbeginend)
|
- [std::begin/end](#stdbeginend)
|
||||||
@@ -1975,6 +1976,23 @@ foo(std::make_shared<T>(), function_that_throws(), std::make_shared<T>());
|
|||||||
|
|
||||||
See the section on [smart pointers](#smart-pointers) for more information on `std::unique_ptr` and `std::shared_ptr`.
|
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<std::reference_wrapper<int>>vec; // vector<int&>vec 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
|
### 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.
|
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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user