mirror of
https://github.com/AnthonyCalandra/modern-cpp-features.git
synced 2025-12-17 18:14:36 +03:00
move; forward; acknowledgements; conclusions.
This commit is contained in:
63
README.md
63
README.md
@@ -1,7 +1,7 @@
|
|||||||
# C++11/14/17
|
# C++11/14/17
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
Many of these descriptions and examples come from their proposal papers, summarized in my own words.
|
Many of these descriptions and examples come from various resources (see [Acknowledgements](#acknowledgements) section), summarized in my own words.
|
||||||
|
|
||||||
C++17 includes the following new language features:
|
C++17 includes the following new language features:
|
||||||
- [template argument deduction for class templates](#template-argument-deduction-for-class-templates)
|
- [template argument deduction for class templates](#template-argument-deduction-for-class-templates)
|
||||||
@@ -834,9 +834,9 @@ a1 = f(A{}); // move-assignment from rvalue temporary
|
|||||||
## C++11 Library Features
|
## C++11 Library Features
|
||||||
|
|
||||||
### std::move
|
### std::move
|
||||||
TODO
|
`std::move` indicates that the object passed to it may be moved, or in other words, moved from one object to another without a copy. The object passed in should not be used after the move in certain situations.
|
||||||
|
|
||||||
Definition of `std::move` (performing a move is nothing more than casting to an rvalue):
|
A definition of `std::move` (performing a move is nothing more than casting to an rvalue):
|
||||||
```c++
|
```c++
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename remove_reference<T>::type&& move(T&& arg) {
|
typename remove_reference<T>::type&& move(T&& arg) {
|
||||||
@@ -844,8 +844,47 @@ typename remove_reference<T>::type&& move(T&& arg) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Transferring `std::unique_ptr`s:
|
||||||
|
```c++
|
||||||
|
std::unique_ptr<int> p1{ new int };
|
||||||
|
std::unique_ptr<int> p2 = p1; // error -- cannot copy unique pointers
|
||||||
|
std::unique_ptr<int> p3 = std::move(p1); // move `p1` into `p2`
|
||||||
|
// now unsafe to dereference object held by `p1`
|
||||||
|
```
|
||||||
|
|
||||||
### std::forward
|
### std::forward
|
||||||
TODO
|
Returns the arguments passed to it as-is, either as an lvalue or rvalue references, and includes cv-qualification. Useful for generic code that need a reference (either lvalue or rvalue) when appropriate, e.g factories. Forwarding gets its power from _template argument deduction_:
|
||||||
|
* `T& &` becomes `T&`
|
||||||
|
* `T& &&` becomes `T&`
|
||||||
|
* `T&& &` becomes `T&`
|
||||||
|
* `T&& &&` becomes `T&&`
|
||||||
|
|
||||||
|
A definition of `std::forward`:
|
||||||
|
```c++
|
||||||
|
template <typename T>
|
||||||
|
T&& forward(typename remove_reference<T>::type& arg) {
|
||||||
|
return static_cast<T&&>(arg);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
An example of a function `wrapper` which just forwards other `A` objects to a new `A` object's copy or move constructor:
|
||||||
|
```c++
|
||||||
|
struct A {
|
||||||
|
A() = default;
|
||||||
|
A(const A& o) { std::cout << "copied" << std::endl; }
|
||||||
|
A(A&& o) { std::cout << "moved" << std::endl; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
A wrapper(T&& arg) {
|
||||||
|
return A{ std::forward<T>(arg) };
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapper(A{}); // moved
|
||||||
|
A a{};
|
||||||
|
wrapper(a); // copied
|
||||||
|
wrapper(std::move(a)); // moved
|
||||||
|
```
|
||||||
|
|
||||||
### std::to_string
|
### std::to_string
|
||||||
Converts a numeric argument to a `std::string`.
|
Converts a numeric argument to a `std::string`.
|
||||||
@@ -933,4 +972,18 @@ These containers maintain average constant-time complexity for search, insert, a
|
|||||||
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.
|
||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
TODO
|
* [cppreference](http://en.cppreference.com/w/cpp) - especially useful for finding examples and documentation of new library features.
|
||||||
|
* [C++ Rvalue References Explained](http://thbecker.net/articles/rvalue_references/section_01.html) - a great introduction I used to understand rvalue references, perfect forwarding, and move semantics.
|
||||||
|
* [clang](http://clang.llvm.org/cxx_status.html) and [gcc](https://gcc.gnu.org/projects/cxx-status.html)'s standards support pages. Also included here are the proposals for language/library features that I used to help find a description of, what it's meant to fix, and some examples.
|
||||||
|
* [Compiler explorer](https://godbolt.org/)
|
||||||
|
* [Scott Meyers' Effective Modern C++](https://www.amazon.com/Effective-Modern-Specific-Ways-Improve/dp/1491903996) - highly recommended book!
|
||||||
|
* [Jason Turner's C++ Weekly](https://www.youtube.com/channel/UCxHAlbZQNFU2LgEtiqd2Maw) - nice collection of C++-related videos.
|
||||||
|
* [What can I do with a moved-from object?](http://stackoverflow.com/questions/7027523/what-can-i-do-with-a-moved-from-object)
|
||||||
|
* [What are some uses of decltype(auto)?](http://stackoverflow.com/questions/24109737/what-are-some-uses-of-decltypeauto)
|
||||||
|
* And many more SO posts I'm forgetting...
|
||||||
|
|
||||||
|
## Author
|
||||||
|
Anthony Calandra
|
||||||
|
|
||||||
|
## License
|
||||||
|
MIT
|
||||||
|
|||||||
Reference in New Issue
Block a user