C++ Move Semantics - The Complete Guide

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Move semantics, introduced with C++11, has become a hallmark of modern C++ programming. However, it also complicates the language in many ways. Even after several years of support, experienced programmers struggle with all the details of move semantics, style guides still recommend different consequences for programming even of trivial classes, and we still discuss semantic details in the C++ standards committee. Whenever I have taught what I have learned about C++ move semantics so far, I have said, “Somebody has to write a book about all this,” and the usual answer was: “Yes, please do!” So, I finally did. As always when writing a book about C++, I was surprised about the number of aspects to be taught, the situations to be clarified, and the consequences to be described. It really was time to write a book about all aspects of move semantics, covering all C++ versions from C++11 up to C++20. I learned a lot and I am sure you will too.

Author(s): Nicolai M. Josuttis
Edition: 1
Publisher: Leanpub
Year: 2022

Language: English
Commentary: Publisher PDF
Pages: 262
Tags: C++; C++20; Move Semantics

C++ Move Semantics
Contents
Preface
An Experiment
Versions of this Book
Acknowledgments
About This Book
What You Should Know Before Reading This Book
Overall Structure of the Book
How to Read This Book
The Way I Implement
Initializations
Error Terminology
Code Simplifications
The C++ Standards
Example Code and Additional Information
Feedback
Part I: Basic Features of Move Semantics
1 The Power of Move Semantics
1.1 Motivation for Move Semantics
1.1.1 Example with C++03 (Before Move Semantics)
1.1.2 Example Since C++11 (Using Move Semantics)
1.2 Implementing Move Semantics
1.2.1 Using the Copy Constructor
1.2.2 Using the Move Constructor
1.3 Copying as a Fallback
1.4 Move Semantics for const Objects
1.4.1 const Return Values
1.5 Summary
2 Core Features of Move Semantics
2.1 Rvalue References
2.1.1 Rvalue References in Detail
2.1.2 Rvalue References as Parameters
2.2 std::move()
2.2.1 Header File for std::move()
2.2.2 Implementation of std::move()
2.3 Moved-From Objects
2.3.1 Valid but Unspecified State
2.3.2 Reusing Moved-From Objects
2.3.3 Move Assignments of Objects to Themselves
2.4 Overloading by Different References
2.4.1 const Rvalue References
2.5 Passing by Value
2.6 Summary
3 Move Semantics in Classes
3.1 Move Semantics in Ordinary Classes
3.1.1 When is Move Semantics Automatically Enabled in Classes?
3.1.2 When Generated Move Operations Are Broken
3.2 Implementing Special Copy/Move Member Functions
3.2.1 Copy Constructor
3.2.2 Move Constructor
3.2.3 Copy Assignment Operator
3.2.4 Move Assignment Operator
3.2.5 Using the Special Copy/Move Member Functions
3.3 Rules for Special Member Functions
3.3.1 Special Member Functions
3.3.2 By Default, We Have Copying and Moving
3.3.3 Declared Copying Disables Moving (Fallback Enabled)
3.3.4 Declared Moving Disables Copying
3.3.5 Deleting Moving Makes No Sense
3.3.6 Disabling Move Semantics with Enabled Copy Semantics
3.3.7 Moving for Members with Disabled Move Semantics
3.3.8 Exact Rules for Generated Special Member Functions
3.4 The Rule of Five or Three
3.5 Summary
4 How to Benefit From Move Semantics
4.1 Avoid Objects with Names
4.1.1 When You Cannot Avoid Using Names
4.2 Avoid Unnecessary std::move()
4.3 Initialize Members with Move Semantics
4.3.1 Initialize Members the Classical Way
4.3.2 Initialize Members via Moved Parameters Passed by Value
4.3.3 Initialize Members via Rvalue References
4.3.4 Compare the Different Approaches
4.3.5 Summary for Member Initialization
4.3.6 Should We Now Always Pass by Value and Move?
4.4 Move Semantics in Class Hierarchies
4.4.1 Implementing a Polymorphic Base Class
4.4.2 Implementing a Polymorphic Derived Class
4.5 Summary
5 Overloading on Reference Qualifiers
5.1 Return Type of Getters
5.1.1 Return by Value
5.1.2 Return by Reference
5.1.3 Using Move Semantics to Solve the Dilemma
5.2 Overloading on Qualifiers
5.3 When to Use Reference Qualifiers
5.3.1 Reference Qualifiers for Assignment Operators
5.3.2 Reference Qualifiers for Other Member Functions
5.4 Summary
6 Moved-From States
6.1 Required and Guaranteed States of Moved-From Objects
6.1.1 Required States of Moved-From Objects
6.1.2 Guaranteed States of Moved-From Objects
6.1.3 Broken Invariants
6.2 Destructible and Assignable
6.2.1 Assignable and Destructible Moved-From Objects
6.2.2 Non-Destructible Moved-From Objects
6.3 Dealing with Broken Invariants
6.3.1 Breaking Invariants Due to a Moved Value Member
6.3.2 Breaking Invariants Due to Moved Consistent Value Members
6.3.3 Breaking Invariants Due to Moved Pointer-Like Members
6.4 Summary
7 Move Semantics and noexcept
7.1 Move Constructors with and without noexcept
7.1.1 Move Constructors without noexcept
7.1.2 Move Constructors with noexcept
7.1.3 Is noexcept Worth It?
7.2 Details of noexcept Declarations
7.2.1 Rules for Declaring Functions with noexcept
7.2.2 noexcept for Special Member Functions
7.3 noexcept Declarations in Class Hierarchies
7.3.1 Checking for noexcept Move Constructors in Abstract Base Classes
7.4 When and Where to Use noexcept
7.5 Summary
8 Value Categories
8.1 Value Categories
8.1.1 History of Value Categories
8.1.2 Value Categories Since C++11
8.1.3 Value Categories Since C++17
8.2 Special Rules for Value Categories
8.2.1 Value Category of Functions
8.2.2 Value Category of Data Members
8.3 Impact of Value Categories When Binding References
8.3.1 Overload Resolution with Rvalue References
8.3.2 Overloading by Reference and Value
8.4 When Lvalues become Rvalues
8.5 When Rvalues become Lvalues
8.6 Checking Value Categories with decltype
8.6.1 Using decltype to Check the Type of Names
8.6.2 Using decltype to Check the Value Category
8.7 Summary
Part II: Move Semantics in Generic Code
9 Perfect Forwarding
9.1 Motivation for Perfect Forwarding
9.1.1 What we Need to Perfectly Forward Arguments
9.2 Implementing Perfect Forwarding
9.2.1 Universal (or Forwarding) References
9.2.2 std::forward<>()
9.2.3 The Effect of Perfect Forwarding
9.3 Rvalue References versus Universal References
9.3.1 Rvalue References of Actual Types
9.3.2 Rvalue References of Function Template Parameters
9.4 Overload Resolution with Universal References
9.4.1 Fixing Overload Resolution with Universal References
9.5 Perfect Forwarding in Lambdas
9.6 Summary
10 Tricky Details of Perfect Forwarding
10.1 Universal References as Non-Forwarding References
10.1.1 Universal References and const
10.1.2 Universal References in Detail
10.1.3 Universal References of Specific Types
10.2 Universal or Ordinary Rvalue Reference?
10.2.1 Rvalue References of Members of Generic Types
10.2.2 Rvalue References of Parameters in Class Templates
10.2.3 Rvalue References of Parameters in Full Specializations
10.3 How the Standard Specifies Perfect Forwarding
10.3.1 Explicit Specification of Types for Universal References
10.3.2 Conflicting Template Parameter Deduction with Universal References
10.3.3 Pure RValue References of Generic Types
10.4 Nasty Details of Perfect Forwarding
10.4.1 ``Universal'' versus ``Forwarding'' Reference
10.4.2 Why && for Both Ordinary Rvalues and Universal References?
10.5 Summary
11 Perfect Passing with auto&&
11.1 Default Perfect Passing
11.1.1 Default Perfect Passing in Detail
11.2 Universal References with auto&&
11.2.1 Type Deduction of auto&&
11.2.2 Perfectly Forwarding an auto&& Reference
11.3 auto&& as Non-Forwarding Reference
11.3.1 Universal References and the Range-Based for Loop
11.4 Perfect Forwarding in Lambdas
11.5 Using auto&& in C++20 Function Declarations
11.6 Summary
12 Perfect Returning with decltype(auto)
12.1 Perfect Returning
12.2 decltype(auto)
12.2.1 Return Type decltype(auto)
12.2.2 Deferred Perfect Returning
12.2.3 Perfect Forwarding and Returning with Lambdas
12.3 Summary
Part III: Move Semantics in the C++ Standard Library
13 Move-Only Types
13.1 Declaring and Using Move-Only Types
13.1.1 Declaring Move-Only Types
13.1.2 Using Move-Only Types
13.1.3 Passing Move-Only Objects as Arguments
13.1.4 Returning Move-Only Objects by Value
13.1.5 Moved-From States of Move-Only Objects
13.2 Summary
14 Moving Algorithms and Iterators
14.1 Moving Algorithms
14.2 Removing Algorithms
14.3 Move Iterators
14.3.1 Move Iterators in Algorithms
14.3.2 Move Iterators in Constructors and Member Functions
14.4 Summary
15 Move Semantics in Types of the C++ Standard Library
15.1 Move Semantics for Strings
15.1.1 String Assignments and Capacity
15.2 Move Semantics for Containers
15.2.1 Basic Move Support for Containers as a Whole
15.2.2 Insert and Emplace Functions
15.2.3 Move Semantics for std::array<>
15.3 Move Semantics for Vocabulary Types
15.3.1 Move Semantics for Pairs
15.3.2 Move Semantics for std::optional<>
15.4 Move Semantics for Smart Pointers
15.4.1 Move Semantics for std::shared_ptr<>
15.4.2 Move Semantics for std::unique_ptr<>
15.5 Move Semantics for IOStreams
15.5.1 Moving IOStream Objects
15.5.2 Using Temporary IOStreams
15.6 Move Semantics for Multithreading
15.6.1 std::thread<> and std::jthread<>
15.6.2 Futures, Promises, and Packaged Tasks
15.7 Summary
Glossary
C
F
G
H
I
L
N
P
R
S
T
U
V
X
Index
A
B
C
D
E
F
G
H
I
J
L
M
N
O
P
R
S
T
U
V
W
X