Click for commercial
licensing information.
Scott Meyers Training Courses
Effective Modern C++
Truly understanding C++11 and C++14 requires more than just
familiarizing yourself with auto type
declarations, move semantics, lambda expressions, concurrency
support, etc. You also need to learn how to use those
features effectively so that your software is
correct, efficient, maintainable, and portable. That’s where
this seminar comes in. It describes how to write truly great
software using C++11 and C++14—i.e. using modern
C++.
This course is based on Scott's best-selling Effective Modern C++. All attendees will receive a copy of this book.
Course Highlights
Participants will gain:
- Familiarity with how best practices in "old" C++ programming (i.e., C++98) change for modern C++.
- Awareness of the often-subtle performance implications of modern C++ features and techniques.
- An understanding of the relationships among
std::move,std::forward, rvalue references, and universal references. - Techniques for writing clear, correct, effective lambda expressions.
- Insights into the pros and cons of braced
initialization,
noexceptspecifications, perfect forwarding, and smart pointermakefunctions.
Who Should Attend
Systems designers, programmers, and technical managers involved in the design, implementation, and maintenance of libraries and applications using C++11 and C++14. Participants should be familiar with the fundamental concepts introduced by C++11 (e.g., move semantics, multithreading, lambda expressions, smart pointers, etc.), but expertise is not required. (One way to acquire the appropriate background is through Scott's more introductory course, An Overview of the New C++ (C++11/14)).
Format
Lecture and question/answer. There are no hands-on exercises, but participants are welcome — encouraged! — to bring computers to experiment with the material as it is presented.
Length
Four full days (six to seven lecture hours per day).
Detailed Topic Outline
- Preliminaries
- Distinguish lvalues and rvalues.
- Understand type deduction.
- (
auto-related) template type deduction autotype deduction- Observing deduced types
decltypetype deduction- Function return type deduction
- (
- Understand
std::moveandstd::forward.
- Moving to Modern C++
- Prefer
autoto explicit types when declaring objects. - Remember that
auto+{ expr }⇒std::initializer_list. - Distinguish
()and{}when creating objects. - Prefer
nullptrto0andNULL. - Prefer scoped enums to unscoped enums.
- Prefer deleted functions to private undefined ones.
- Declare overriding functions
override. - Declare functions
noexceptif they won’t emit exceptions. - Use
constexprwhenever possible. - Make
constmember functions thread-safe.
- Prefer
- Smart Pointers
- Use
std::unique_ptrfor exclusive-ownership resource management. - Use
std::shared_ptrfor shared-ownership resource management. - Prefer
std::make_uniqueandstd::make_sharedto direct use ofnew.
- Use
- Rvalue References, Move Semantics, and Perfect Forwarding
- Distinguish universal references from rvalue references.
- Pass and return rvalue references via
std::move, universal references viastd::forward. - Avoid overloading on universal references.
- Understand reference collapsing.
- Assume that move operations are not present, not cheap, and not used.
- Familiarize yourself with perfect forwarding failure cases.
- Lambda Expressions
- Avoid default capture modes.
- Use init capture to move objects into closures.
- Prefer lambdas to
std::bind.
- The Concurrency API
- Make
std::threads unjoinable on all paths. - Use
std::launch::asyncwithstd::asyncif asynchronicity is essential. - Be aware of varying thread handle destructor behavior.
- Create tasks, not threads.
- Consider
voidfutures for one-shot event communication.
- Make
- Miscellaneous
- Consider emplacement instead of insertion.
- Resources for Further Information
For more information on this course, contact Scott directly.


