Leanpub Header

Skip to main content

C++ Move Semantics - The Complete Guide

All aspects of C++ move semantics with intutive motivation, compelling examples, and tricky details.

The book is complete now and done.

Printed version

Bundle with C++17 - The Complete Guide

C++23

C++20

C++17

Minimum price

$9.90

$19.90

You pay

$19.90

Author earns

$15.92
$

...Or Buy With Credits!

You can get credits monthly with a Reader Membership
PDF
EPUB
WEB
2,637
Readers
0
Pages
58,128Words
About

About

About the Book

Move semantics, introduced with C++11, has become a hallmark of modern C++ programming. However, it also complicates the language in many ways. After several years of support of move semantics experienced programmers struggle with all the details of move semantics. Even for trivial classes, style guides give conflicting or inappropriate advice on how to benefit from move semantics. Time to explain all aspects of C++ move semantics in detail.

This book teaches C++ move semantics. Starting from the basic principles, it motivates and explains all the corner cases of move semantics so that as a programmer, you can use move semantics correctly. The book is valuable for those who are just starting to learn about move semantics and is essential for those who are using it already.

You will learn:

  • The motivation for and terminology of move semantics
  • How and why you benefit implicitly from move semantics
  • How to benefit explicitly from move semantics
  • All the traps involved in move semantics and how to deal with them
  • All the consequences of move semantics for your programming style

As usual for books by Nicolai Josuttis, the focus lies on the application of the described features in practice. Compelling examples and useful background information help to understand and improve code, from trivial classes up to generic foundation libraries and frameworks.

Testimonials:

"Sometimes I think I have a better grasp on entanglement & quantum teleportation than I do in some weird C++ move semantics. To paraphrase Feynman: If you think you understand C++ move semantics, you don't understand C++ move semantics. Read this book." Victor Ciura

"This is the book I’ve needed for a long time." Rob Bernstein

"I thought I understood move semantics but I didn't really! I learnt a lot in your book." Jonathan Boccara

Buy early, pay less, free updates

Note that this book is published step-by-step. It started with 110 pages first published in January 2020. Since then, the content grows with new chapters, examples, and caveats about the features of move semantics and I integrate all feedback I get for the pages already published.

Currently, the book is feature complete (all language features are described).

Only the use of move semantics in the C++ standard library and the final proof reading (yes, I am not a native English writer) is missing.

See www.cppmove.com for a detailed list of covered topics.

As written, once you bought it you will get all updates for free.

There is not errata yet, but I welcome all feedback to improve the current version.

Look at http://www.cppmove.com/feedback.html.

PDF versus Other Formats

I write the book in LaTeX and generate PDF from it (the way I wrote my other books). The other formats (epub, mobi, and online reading) come from the leanpub markdown interface, for which I generate the necessary input from LaTeX by script.

Thus, the PDF layout has a better quality than the other formats. For example, the syntax highlighting rules for the formats other than PDF have to get fixed as soon as possible and the index is missing yet. Leanpub and me are working on corresponding improvements.

I hope you enjoy and benefit.

Nico

#movetcg

Share this book

Categories

Author

About the Author

Nicolai M. Josuttis

Nicolai Josuttis (http://www.josuttis.com) is well known in the programming community because he not only speaks and writes with authority, being the (co-)author of the world-wide best sellers

but is also an innovative presenter, having talked at various conferences and events.

He is an independent trainer and speaker being active in C++ standardization for more than 20 years.

Leanpub Podcast

Episode 89

An Interview with Nicolai M. Josuttis

Contents

Table of Contents

Preface

  1. An Experiment
  2. Versions of This Book
  3. Acknowledgments

About This Book

  1. What You Should Know Before Reading This Book
  2. Overall Structure of the Book
  3. How to Read This Book
  4. The Way I Implement
  5. Initializations
  6. Error Terminology
  7. Code Simplifications
  8. The C++ Standards
  9. Example Code and Additional Information
  10. Feedback
  11. IBasic Features of Move Semantics

1.The Power of Move Semantics

  1. 1.1Motivation for Move Semantics
  2. 1.1.1Example with C++03 (Before Move Semantics)
  3. 1.1.2Example Since C++11 (Using Move Semantics)
  4. 1.2Implementing Move Semantics
  5. 1.2.1Using the Copy Constructor
  6. 1.2.2Using the Move Constructor
  7. 1.3Copying as a Fallback
  8. 1.4Move Semantics for const Objects
  9. 1.4.1const Return Values
  10. 1.5Summary

2.Core Features of Move Semantics

  1. 2.1Rvalue References
  2. 2.1.1Rvalue References in Detail
  3. 2.1.2Rvalue References as Parameters
  4. 2.2std::move()
  5. 2.2.1Header File for std::move()
  6. 2.2.2Implementation of std::move()
  7. 2.3Moved-From Objects
  8. 2.3.1Valid but Unspecified State
  9. 2.3.2Reusing Moved-From Objects
  10. 2.3.3Move Assignments of Objects to Themselves
  11. 2.4Overloading by Different References
  12. 2.4.1const Rvalue References
  13. 2.5Passing by Value
  14. 2.6Summary

3.Move Semantics in Classes

  1. 3.1Move Semantics in Ordinary Classes
  2. 3.1.1When is Move Semantics Automatically Enabled in Classes?
  3. 3.1.2When Generated Move Operations Are Broken
  4. 3.2Implementing Special Copy/Move Member Functions
  5. 3.2.1Copy Constructor
  6. 3.2.2Move Constructor
  7. 3.2.3Copy Assignment Operator
  8. 3.2.4Move Assignment Operator
  9. 3.2.5Using the Special Copy/Move Member Functions
  10. 3.3Rules for Special Member Functions
  11. 3.3.1Special Member Functions
  12. 3.3.2By Default, We Have Copying and Moving
  13. 3.3.3Declared Copying Disables Moving (Fallback Enabled)
  14. 3.3.4Declared Moving Disables Copying
  15. 3.3.5Deleting Moving Makes No Sense
  16. 3.3.6Disabling Move Semantics with Enabled Copy Semantics
  17. 3.3.7Moving for Members with Disabled Move Semantics
  18. 3.3.8Exact Rules for Generated Special Member Functions
  19. 3.4The Rule of Five or Three
  20. 3.5Summary

4.How to Benefit From Move Semantics

  1. 4.1Avoid Objects with Names
  2. 4.1.1When You Cannot Avoid Using Names
  3. 4.2Avoid Unnecessary std::move()
  4. 4.3Initialize Members with Move Semantics
  5. 4.3.1Initialize Members the Classical Way
  6. 4.3.2Initialize Members via Moved Parameters Passed by Value
  7. 4.3.3Initialize Members via Rvalue References
  8. 4.3.4Compare the Different Approaches
  9. 4.3.5Summary for Member Initialization
  10. 4.3.6Should We Now Always Pass by Value and Move?
  11. 4.4Move Semantics in Class Hierarchies
  12. 4.4.1Implementing a Polymorphic Base Class
  13. 4.4.2Implementing a Polymorphic Derived Class
  14. 4.5Summary

5.Overloading on Reference Qualifiers

  1. 5.1Return Type of Getters
  2. 5.1.1Return by Value
  3. 5.1.2Return by Reference
  4. 5.1.3Using Move Semantics to Solve the Dilemma
  5. 5.2Overloading on Qualifiers
  6. 5.3When to Use Reference Qualifiers
  7. 5.3.1Reference Qualifiers for Assignment Operators
  8. 5.3.2Reference Qualifiers for Other Member Functions
  9. 5.4Summary

6.Moved-From States

  1. 6.1Required and Guaranteed States of Moved-From Objects
  2. 6.1.1Required States of Moved-From Objects
  3. 6.1.2Guaranteed States of Moved-From Objects
  4. 6.1.3Broken Invariants
  5. 6.2Destructible and Assignable
  6. 6.2.1Assignable and Destructible Moved-From Objects
  7. 6.2.2Non-Destructible Moved-From Objects
  8. 6.3Dealing with Broken Invariants
  9. 6.3.1Breaking Invariants Due to a Moved Value Member
  10. 6.3.2Breaking Invariants Due to Moved Consistent Value Members
  11. 6.3.3Breaking Invariants Due to Moved Pointer-Like Members
  12. 6.4Summary

7.Move Semantics and noexcept

  1. 7.1Move Constructors with and without noexcept
  2. 7.1.1Move Constructors without noexcept
  3. 7.1.2Move Constructors with noexcept
  4. 7.1.3Is noexcept Worth It?
  5. 7.2Details of noexcept Declarations
  6. 7.2.1Rules for Declaring Functions with noexcept
  7. 7.2.2noexcept for Special Member Functions
  8. 7.3noexcept Declarations in Class Hierarchies
  9. 7.3.1Checking for noexcept Move Constructors in Abstract Base Classes
  10. 7.4When and Where to Use noexcept
  11. 7.5Summary

8.Value Categories

  1. 8.1Value Categories
  2. 8.1.1History of Value Categories
  3. 8.1.2Value Categories Since C++11
  4. 8.1.3Value Categories Since C++17
  5. 8.2Special Rules for Value Categories
  6. 8.2.1Value Category of Functions
  7. 8.2.2Value Category of Data Members
  8. 8.3Impact of Value Categories When Binding References
  9. 8.3.1Overload Resolution with Rvalue References
  10. 8.3.2Overloading by Reference and Value
  11. 8.4When Lvalues become Rvalues
  12. 8.5When Rvalues become Lvalues
  13. 8.6Checking Value Categories with decltype
  14. 8.6.1Using decltype to Check the Type of Names
  15. 8.6.2Using decltype to Check the Value Category
  16. 8.7Summary
  17. IIMove Semantics in Generic Code

9.Perfect Forwarding

  1. 9.1Motivation for Perfect Forwarding
  2. 9.1.1What we Need to Perfectly Forward Arguments
  3. 9.2Implementing Perfect Forwarding
  4. 9.2.1Universal (or Forwarding) References
  5. 9.2.2std::forward<>()
  6. 9.2.3The Effect of Perfect Forwarding
  7. 9.3Rvalue References versus Universal References
  8. 9.3.1Rvalue References of Actual Types
  9. 9.3.2Rvalue References of Function Template Parameters
  10. 9.4Overload Resolution with Universal References
  11. 9.4.1Fixing Overload Resolution with Universal References
  12. 9.5Perfect Forwarding in Lambdas
  13. 9.6Summary

10.Tricky Details of Perfect Forwarding

  1. 10.1Universal References as Non-Forwarding References
  2. 10.1.1Universal References and const
  3. 10.1.2Universal References in Detail
  4. 10.1.3Universal References of Specific Types
  5. 10.2Universal or Ordinary Rvalue Reference?
  6. 10.2.1Rvalue References of Members of Generic Types
  7. 10.2.2Rvalue References of Parameters in Class Templates
  8. 10.2.3Rvalue References of Parameters in Full Specializations
  9. 10.3How the Standard Specifies Perfect Forwarding
  10. 10.3.1Explicit Specification of Types for Universal References
  11. 10.3.2Conflicting Template Parameter Deduction with Universal References
  12. 10.3.3Pure RValue References of Generic Types
  13. 10.4Nasty Details of Perfect Forwarding
  14. 10.4.1“Universal” versus “Forwarding” Reference
  15. 10.4.2Why && for Both Ordinary Rvalues and Universal References?
  16. 10.5Summary

11.Perfect Passing with auto&&

  1. 11.1Default Perfect Passing
  2. 11.1.1Default Perfect Passing in Detail
  3. 11.2Universal References with auto&&
  4. 11.2.1Type Deduction of auto&&
  5. 11.2.2Perfectly Forwarding an auto&& Reference
  6. 11.3auto&& as Non-Forwarding Reference
  7. 11.3.1Universal References and the Range-Based for Loop
  8. 11.4Perfect Forwarding in Lambdas
  9. 11.5Using auto&& in C++20 Function Declarations
  10. 11.6Summary

12.Perfect Returning with decltype(auto)

  1. 12.1Perfect Returning
  2. 12.2decltype(auto)
  3. 12.2.1Return Type decltype(auto)
  4. 12.2.2Deferred Perfect Returning
  5. 12.2.3Perfect Forwarding and Returning with Lambdas
  6. 12.3Summary
  7. IIIMove Semantics in the C++ Standard Library

13.Move-Only Types

  1. 13.1Declaring and Using Move-Only Types
  2. 13.1.1Declaring Move-Only Types
  3. 13.1.2Using Move-Only Types
  4. 13.1.3Passing Move-Only Objects as Arguments
  5. 13.1.4Returning Move-Only Objects by Value
  6. 13.1.5Moved-From States of Move-Only Objects
  7. 13.2Summary

14.Moving Algorithms and Iterators

  1. 14.1Moving Algorithms
  2. 14.2Removing Algorithms
  3. 14.3Move Iterators
  4. 14.3.1Move Iterators in Algorithms
  5. 14.3.2Move Iterators in Constructors and Member Functions
  6. 14.4Summary

15.Move Semantics in Types of the C++ Standard Library

  1. 15.1Move Semantics for Strings
  2. 15.1.1String Assignments and Capacity
  3. 15.2Move Semantics for Containers
  4. 15.2.1Basic Move Support for Containers as a Whole
  5. 15.2.2Insert and Emplace Functions
  6. 15.2.3Move Semantics for std::array<>
  7. 15.3Move Semantics for Vocabulary Types
  8. 15.3.1Move Semantics for Pairs
  9. 15.3.2Move Semantics for std::optional<>
  10. 15.4Move Semantics for Smart Pointers
  11. 15.4.1Move Semantics for std::shared_ptr<>
  12. 15.4.2Move Semantics for std::unique_ptr<>
  13. 15.5Move Semantics for IOStreams
  14. 15.5.1Moving IOStream Objects
  15. 15.5.2Using Temporary IOStreams
  16. 15.6Move Semantics for Multithreading
  17. 15.6.1std::thread<> and std::jthread<>
  18. 15.6.2Futures, Promises, and Packaged Tasks
  19. 15.7Summary

Glossary

  1. C
  2. CPP file
  3. F
  4. forwarding reference
  5. full specialization
  6. G
  7. glvalue
  8. H
  9. header file
  10. I
  11. include file
  12. incomplete type
  13. L
  14. lvalue
  15. N
  16. named return value optimization (NRVO)
  17. P
  18. prvalue
  19. R
  20. return value optimization (RVO)
  21. rvalue
  22. S
  23. small/short string optimization (SSO)
  24. T
  25. translation unit
  26. U
  27. universal reference
  28. V
  29. value category
  30. variadic template
  31. X
  32. xvalue

The Leanpub 60 Day 100% Happiness Guarantee

Within 60 days of purchase you can get a 100% refund on any Leanpub purchase, in two clicks.

Now, this is technically risky for us, since you'll have the book or course files either way. But we're so confident in our products and services, and in our authors and readers, that we're happy to offer a full money back guarantee for everything we sell.

You can only find out how good something is by trying it, and because of our 100% money back guarantee there's literally no risk to do so!

So, there's no reason not to click the Add to Cart button, is there?

See full terms...

Earn $8 on a $10 Purchase, and $16 on a $20 Purchase

We pay 80% royalties on purchases of $7.99 or more, and 80% royalties minus a 50 cent flat fee on purchases between $0.99 and $7.98. You earn $8 on a $10 sale, and $16 on a $20 sale. So, if we sell 5000 non-refunded copies of your book for $20, you'll earn $80,000.

(Yes, some authors have already earned much more than that on Leanpub.)

In fact, authors have earned over $14 million writing, publishing and selling on Leanpub.

Learn more about writing on Leanpub

Free Updates. DRM Free.

If you buy a Leanpub book, you get free updates for as long as the author updates the book! Many authors use Leanpub to publish their books in-progress, while they are writing them. All readers get free updates, regardless of when they bought the book or how much they paid (including free).

Most Leanpub books are available in PDF (for computers) and EPUB (for phones, tablets and Kindle). The formats that a book includes are shown at the top right corner of this page.

Finally, Leanpub books don't have any DRM copy-protection nonsense, so you can easily read them on any supported device.

Learn more about Leanpub's ebook formats and where to read them

Write and Publish on Leanpub

You can use Leanpub to easily write, publish and sell in-progress and completed ebooks and online courses!

Leanpub is a powerful platform for serious authors, combining a simple, elegant writing and publishing workflow with a store focused on selling in-progress ebooks.

Leanpub is a magical typewriter for authors: just write in plain text, and to publish your ebook, just click a button. (Or, if you are producing your ebook your own way, you can even upload your own PDF and/or EPUB files and then publish with one click!) It really is that easy.

Learn more about writing on Leanpub