<p>I would guess that taking such courses is a gross waste of time unless they are specifically focused on recent additions to C++. Most of the &quot;beginning C++ courses&quot; won't even get you to essential new features.</p>
<p>I haven't followed updates to the language for a long time but first, I think that the &quot;new&quot; language is backward compatible with the &quot;old&quot; language (unlike Python). So, what you need are incremental changes in most things to what you already know.</p>
<p>But I also think that the programming style in modern C++ has changed, depending more on library code than was true in the past. What you need to do is find a way to become comfortable with that newer programming style.</p>
<p>I would think that a book like this one from the very capable <a href="https://rads.stackoverflow.com/amzn/click/com/1491903996" rel="nofollow noreferrer" rel="nofollow noreferrer">Scott Myers</a> would get you started. I don't have the book, but Myers has been trustworthy in the past. Use the ideas there to build something significant.</p>

CC BY-SA 4.0
2020-12-29T16:49:41.277Z
I do like Myers, but [he has retired form C++](https://www.reddit.com/r/cpp/comments/7j50cp/effective_modern_c17/). I am not sure why I even asked this, as code, despite being he "be all and end all" is actually the most trivial part of sotware development.  Btw, can hands dirty industry guys help you educators?
Mawg
CC BY-SA 4.0
2020-12-29T20:45:55.140Z
@MawgsaysreinstateMonica They help at my institution.  They do curricular review with us as part of our long-term planning and oversight.  It's very helpful!  We also sometimes have professionals come and speak to the students about careers.
Ben I.
CC BY-SA 4.0
2020-12-31T23:52:45.633Z
Us industry folk can be the problem: Making students learn Java and C++ before they can program. However Lean, test-driven, revision-control, Unix, Free-software, and a few other practices would not go a miss.
ctrl-alt-delor
CC BY-SA 4.0
2020-12-29T16:34:39.987Z
2020-12-29T16:34:39.987Z
Buffy
<p>I had a similar problem 8/9 years ago, but with C++11.</p>
<p>The trick is that there is no trick. You simply sit and use the feature you want to use. Besides that it is also beneficial to know C++14 before getting into C++17 and know C++11 before getting familiar with C++14 features. (Obviously prerequisite for C++11 is C++03/98, but that's already covered by OP).</p>
<p>If getting up-to-date with C++17 (C++20 actually was vote in 2020) I would start with feature list grouped <a href="https://github.com/AnthonyCalandra/modern-cpp-features" rel="noreferrer">here</a>. The problem is that there are so many of them that one may have problems in how to approach them, thus I've provided an ordered list that shows how I would teach it to people:</p>
<h2>C++11 warm-up</h2>
<ul>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#nullptr" rel="noreferrer"><code>nullptr</code></a> - you won't be using <code>NULL</code> of <code>0</code> for null pointers anymore</li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#static-assertions" rel="noreferrer">static assertions</a> - allows you to enforce some assertions at compile time</li>
<li><a href="https://en.cppreference.com/w/cpp/language/enum" rel="noreferrer">scoped enums</a> - no more enums collisions!</li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#type-aliases" rel="noreferrer">type alias</a></li>
</ul>
<h2>Basic C++11 stuff</h2>
<ul>
<li>move semantics (<a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#move-semantics" rel="noreferrer">overview</a> + <a href="https://stackoverflow.com/questions/3106110/what-is-move-semantics">SO question</a>) - move semantics and rvalue references are the corner stone of modern C++, what follows is the rule of 5 (or 3/5/0 if being precise)
<ul>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#rvalue-references" rel="noreferrer">rvalue references</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#special-member-functions-for-move-semantics" rel="noreferrer">move semantics in a class</a></li>
<li><a href="https://en.cppreference.com/w/cpp/language/rule_of_three" rel="noreferrer">rule of 3/5/0</a></li>
</ul>
</li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#auto" rel="noreferrer">auto</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#lambda-expressions" rel="noreferrer">lambda expressions</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#range-based-for-loops" rel="noreferrer">ranged for loops</a> - because <code>for(auto const&amp; e: {1, 2, 3}) { std::cout &lt;&lt;e &lt;&lt;'\n'; }</code> is so cool :)</li>
<li>classes related stuff:
<ul>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#default-functions" rel="noreferrer">default functions/methods</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#deleted-functions" rel="noreferrer">deleted functions/methods</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#final-specifier" rel="noreferrer"><code>final</code> keyword</a></li>
</ul>
</li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#constexpr" rel="noreferrer"><code>constexpr</code> specifier</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#initializer-lists" rel="noreferrer">initializers lists</a> - it is used mainly in <code>std::vector&lt;...&gt;</code> so it's important to know how it works and what are problems involved with them (it is not my favourite C++11 feature)</li>
</ul>
<h2>Extra C++11 stuff</h2>
<ul>
<li><a href="https://github.com/tg-m/modern-cpp-features/blob/master/CPP11.md#tuples" rel="noreferrer"><code>std::tuple</code></a>
<ul>
<li>But avoid <code>std::tie</code>, prefer structured bindings from C++17 (you can break the rule here and look them up ahead)</li>
</ul>
</li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#stdthread" rel="noreferrer"><code>std::thread</code></a> - no more <code>pthreads</code>!
<ul>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#stdref" rel="noreferrer"><code>std::ref</code></a> - useful when you want to pass references to other threads</li>
</ul>
</li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#variadic-templates" rel="noreferrer">variadic templates</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#forwarding-references" rel="noreferrer">forwarding references</a> - useful when want to preserve move semantics when dealing with templates</li>
</ul>
<h2>C++14 &amp; C++17</h2>
<ul>
<li>After these basics I would read about the other C++11 related features or moved to C++14 features listed <a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP14.md" rel="noreferrer">here</a> (and consult C++11 features list when necessary). Note that C++14 was a nice little amendment to C++11 so there aren't many new (and cool) stuff.</li>
<li>C++17 features worth mentioning (very subjective opinion, at this point you should already know what you want/need to know):
<ul>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#inline-variables" rel="noreferrer">inline variables</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#structured-bindings" rel="noreferrer">structured bindings</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#constexpr-if" rel="noreferrer"><code>if constexpr</code></a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#folding-expressions" rel="noreferrer">fold expressions 1</a> and <a href="https://en.cppreference.com/w/cpp/language/fold" rel="noreferrer">fold expressions 2</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#lambda-capture-this-by-value" rel="noreferrer">lambda <code>this</code> capture changes/updates</a></li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#stdvariant" rel="noreferrer"><code>std::variant</code></a> + <a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#stdoptional" rel="noreferrer"><code>std::optional</code></a></li>
</ul>
</li>
</ul>
<h2>C++20</h2>
<ul>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP20.md#concepts" rel="noreferrer">Concepts</a> are the new big thing</li>
<li><a href="https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP20.md#immediate-functions" rel="noreferrer">immediate functions</a></li>
<li>IMHO <a href="https://en.cppreference.com/w/cpp/language/modules" rel="noreferrer">modules</a> will be a dead end as long as C++ will be split into header and implementation fiels (besides Rust have better package/modules concept). But that's just an opinion bouncing in my head.</li>
<li>Remaining C++20 and previous version stuff (obviously only a fraction was covered in this post :)).</li>
</ul>

CC BY-SA 4.0
2021-01-05T15:01:06.567Z
2021-01-05T15:01:06.567Z
shycha
<p>Tl;dr - the subject is enough. For background, read below.</p>
<p>I am a professional, freelance, embedded software developer. I first learned about C++ in the 90s and taught myself from a book <a href="https://rads.stackoverflow.com/amzn/click/com/0201395193" rel="nofollow noreferrer" rel="nofollow noreferrer">C++ for C programmers</a>.</p>
<p>The beauty of that was that it assumed that I knew C and didn't have to spend chapter after chapter explaining how to declare a variable/what a variable is, function/passing parameters/returning a result, loops, etc, etc, etc.</p>
<p>So, it cut quickly to the chase and I started learning from page 1, rather than skipping forward.</p>
<hr />
<p>Fast (?) forward a few decades, and I no longer code (much) assembler.  Work seems to be split between C, Ada (mostly for defence) and C++.</p>
<p>It has been four years since my last C++ gig, and, industry being conservative does not adopt new version of languages for some time, until they can be seen to be widely accepted as stable (if any of you non-industry guys what to know why, then we generally want to wait until &quot;they get the bugs out of the new compiler&quot;. Given that a lot of embedded can be life-critical, you can understand why).</p>
<p>So, now I am seeing ads requiring C++ 2014 and 2017 (and my latest experience is 2003). The delicious irony of this is that I know, from bitter experience, that coding standards will forbid me from using the new features intruded in those versions.</p>
<p>All of my life, I have taught myself new languages &amp; concepts from books. Earlier this year, I took a leap of faith &amp; taught myself Flutter/Dart (for personal, non-professional use) from <a href="https://www.udemy.com/course/flutter-bootcamp-with-dart/" rel="nofollow noreferrer">a Udemy course</a>. That was an eye-opener, and I won't be responsible for the death of any more trees in future.</p>
<p>But, I digress (this entire screed has been a digression, if you ask me). I have now purchased <a href="https://www.udemy.com/share/103LceAEITeFZUTXUB/" rel="nofollow noreferrer">another Udemy course</a> to learn C++.</p>
<p>And, finally, after all of that, my question is still the same as its title - &quot;I know C++ 2003 How to start learning C++ 2017 ?&quot;.</p>
<p>Do I watch the start of each chapter, and skip if I yawn? Do I read the table of contents and take a stab at where to jump in?</p>
<p>Given that you are a group of educators, I imagine that this is not a new situation to you, but am not sure that it has an answer which does not involve the length of pieces of string.</p>

CC BY-SA 4.0
2020-12-29T18:54:03.833Z
You might browse https://en.cppreference.com/w/cpp and look at the various C++ versions and features. When you find something interesting, experiment with it and see if you find it useful.
Fritz Sieker
CC BY-SA 4.0
2020-12-30T01:00:45.043Z
Recommend this lecture by Stroustrup circa 2014 on "The Essence of C++" in which along the way he highlights what he considers canonical C++14 usage: https://www.youtube.com/watch?v=86xWVb4XIyE
Daniel R. Collins
CC BY-SA 4.0
2020-12-31T23:48:09.803Z
I read the list of features that were introduced in each new standard: As I read I smiled an said "aah new feature-a, they took that from Lisp, but a different syntax", and "aah new feature-b, they took that from Lisp, but a different syntax", … In the end my heart sank. I could learn this, but how could I ever hire someone that know it: C++ was already too big, now it is bigger.
ctrl-alt-delor
CC BY-SA 4.0
2021-01-02T08:41:08.857Z
Well, it has been \*cough\* decades since I coded Lisp, at uni, but I was thinking "ooh, JS feature envy!" a few times, so I know what you mean (+1). Why bother with promises when you already have callbacks (and Finite State Machines)? Why lambdas, when anything over a 2 or 3 line body is tempting unreadable/unmaintainable code, and anything shorter will be inlined by the compiler?  Fortunately, as I mentioned, most company coding standards forbid many of the frills. But, alas, they don't forbid interviewers from asking about them :-(
Mawg
<self-learning>
I know C++ 2003 How to start learning C++ 2017?
# I know C++ 2003 How to start learning C++ 2017?

(Asked by: username_0 on 2020-12-29)

Tl;dr - the subject is enough. For background, read below.

I am a professional, freelance, embedded software developer. I first learned about C++ in the 90s and taught myself from a book [C++ for C programmers](https://rads.stackoverflow.com/amzn/click/com/0201395193).

The beauty of that was that it assumed that I knew C and didn't have to spend chapter after chapter explaining how to declare a variable/what a variable is, function/passing parameters/returning a result, loops, etc, etc, etc.

So, it cut quickly to the chase and I started learning from page 1, rather than skipping forward.

---

Fast (?) forward a few decades, and I no longer code (much) assembler. Work seems to be split between C, Ada (mostly for defence) and C++.

It has been four years since my last C++ gig, and, industry being conservative does not adopt new version of languages for some time, until they can be seen to be widely accepted as stable (if any of you non-industry guys what to know why, then we generally want to wait until "they get the bugs out of the new compiler". Given that a lot of embedded can be life-critical, you can understand why).

So, now I am seeing ads requiring C++ 2014 and 2017 (and my latest experience is 2003). The delicious irony of this is that I know, from bitter experience, that coding standards will forbid me from using the new features intruded in those versions.

All of my life, I have taught myself new languages & concepts from books. Earlier this year, I took a leap of faith & taught myself Flutter/Dart (for personal, non-professional use) from [a Udemy course](https://www.udemy.com/course/flutter-bootcamp-with-dart/). That was an eye-opener, and I won't be responsible for the death of any more trees in future.

But, I digress (this entire screed has been a digression, if you ask me). I have now purchased [another Udemy course](https://www.udemy.com/share/103LceAEITeFZUTXUB/) to learn C++.

And, finally, after all of that, my question is still the same as its title - "I know C++ 2003 How to start learning C++ 2017 ?".

Do I watch the start of each chapter, and skip if I yawn? Do I read the table of contents and take a stab at where to jump in?

Given that you are a group of educators, I imagine that this is not a new situation to you, but am not sure that it has an answer which does not involve the length of pieces of string.

**Tags:** self-learning

> **Comments:**
> **username_1**: You might browse https://en.cppreference.com/w/cpp and look at the various C++ versions and features. When you find something interesting, experiment with it and see if you find it useful.  
> **username_2**: Recommend this lecture by Stroustrup circa 2014 on "The Essence of C++" in which along the way he highlights what he considers canonical C++14 usage: https://www.youtube.com/watch?v=86xWVb4XIyE  
> **username_3**: I read the list of features that were introduced in each new standard: As I read I smiled an said "aah new feature-a, they took that from Lisp, but a different syntax", and "aah new feature-b, they took that from Lisp, but a different syntax", … In the end my heart sank. I could learn this, but how could I ever hire someone that know it: C++ was already too big, now it is bigger.  
> **username_0**: Well, it has been \*cough\* decades since I coded Lisp, at uni, but I was thinking "ooh, JS feature envy!" a few times, so I know what you mean (+1). Why bother with promises when you already have callbacks (and Finite State Machines)? Why lambdas, when anything over a 2 or 3 line body is tempting unreadable/unmaintainable code, and anything shorter will be inlined by the compiler?  Fortunately, as I mentioned, most company coding standards forbid many of the frills. But, alas, they don't forbid interviewers from asking about them :-(  

---

## 2 answers

### Answer by username_6 on 2021-01-05. Score: 6 | Accepted answer

I had a similar problem 8/9 years ago, but with C++11.

The trick is that there is no trick. You simply sit and use the feature you want to use. Besides that it is also beneficial to know C++14 before getting into C++17 and know C++11 before getting familiar with C++14 features. (Obviously prerequisite for C++11 is C++03/98, but that's already covered by OP).

If getting up-to-date with C++17 (C++20 actually was vote in 2020) I would start with feature list grouped [here](https://github.com/AnthonyCalandra/modern-cpp-features). The problem is that there are so many of them that one may have problems in how to approach them, thus I've provided an ordered list that shows how I would teach it to people:

## C++11 warm-up

* [`nullptr`](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#nullptr) - you won't be using `NULL` of `0` for null pointers anymore
* [static assertions](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#static-assertions) - allows you to enforce some assertions at compile time
* [scoped enums](https://en.cppreference.com/w/cpp/language/enum) - no more enums collisions!
* [type alias](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#type-aliases)

## Basic C++11 stuff

* move semantics ([overview](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#move-semantics) + [SO question](https://stackoverflow.com/questions/3106110/what-is-move-semantics)) - move semantics and rvalue references are the corner stone of modern C++, what follows is the rule of 5 (or 3/5/0 if being precise)
  + [rvalue references](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#rvalue-references)
  + [move semantics in a class](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#special-member-functions-for-move-semantics)
  + [rule of 3/5/0](https://en.cppreference.com/w/cpp/language/rule_of_three)
* [auto](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#auto)
* [lambda expressions](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#lambda-expressions)
* [ranged for loops](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#range-based-for-loops) - because `for(auto const& e: {1, 2, 3}) { std::cout < is so cool :)`
* classes related stuff:
  + [default functions/methods](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#default-functions)
  + [deleted functions/methods](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#deleted-functions)
  + [`final` keyword](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#final-specifier)
* [`constexpr` specifier](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#constexpr)
* [initializers lists](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#initializer-lists) - it is used mainly in `std::vector<...>` so it's important to know how it works and what are problems involved with them (it is not my favourite C++11 feature)

## Extra C++11 stuff

* [`std::tuple`](https://github.com/tg-m/modern-cpp-features/blob/master/CPP11.md#tuples)
  + But avoid `std::tie`, prefer structured bindings from C++17 (you can break the rule here and look them up ahead)
* [`std::thread`](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#stdthread) - no more `pthreads`!
  + [`std::ref`](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#stdref) - useful when you want to pass references to other threads
* [variadic templates](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#variadic-templates)
* [forwarding references](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP11.md#forwarding-references) - useful when want to preserve move semantics when dealing with templates

## C++14 & C++17

* After these basics I would read about the other C++11 related features or moved to C++14 features listed [here](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP14.md) (and consult C++11 features list when necessary). Note that C++14 was a nice little amendment to C++11 so there aren't many new (and cool) stuff.
* C++17 features worth mentioning (very subjective opinion, at this point you should already know what you want/need to know):
  + [inline variables](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#inline-variables)
  + [structured bindings](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#structured-bindings)
  + [`if constexpr`](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#constexpr-if)
  + [fold expressions 1](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#folding-expressions) and [fold expressions 2](https://en.cppreference.com/w/cpp/language/fold)
  + [lambda `this` capture changes/updates](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#lambda-capture-this-by-value)
  + [`std::variant`](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#stdvariant) + [`std::optional`](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md#stdoptional)

## C++20

* [Concepts](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP20.md#concepts) are the new big thing
* [immediate functions](https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP20.md#immediate-functions)
* IMHO [modules](https://en.cppreference.com/w/cpp/language/modules) will be a dead end as long as C++ will be split into header and implementation fiels (besides Rust have better package/modules concept). But that's just an opinion bouncing in my head.
* Remaining C++20 and previous version stuff (obviously only a fraction was covered in this post :)).


---

### Answer by username_4 on 2020-12-29. Score: 3

I would guess that taking such courses is a gross waste of time unless they are specifically focused on recent additions to C++. Most of the "beginning C++ courses" won't even get you to essential new features.

I haven't followed updates to the language for a long time but first, I think that the "new" language is backward compatible with the "old" language (unlike Python). So, what you need are incremental changes in most things to what you already know.

But I also think that the programming style in modern C++ has changed, depending more on library code than was true in the past. What you need to do is find a way to become comfortable with that newer programming style.

I would think that a book like this one from the very capable [Scott Myers](https://rads.stackoverflow.com/amzn/click/com/1491903996) would get you started. I don't have the book, but Myers has been trustworthy in the past. Use the ideas there to build something significant.

> **Comments:**
> **username_0**: I do like Myers, but [he has retired form C++](https://www.reddit.com/r/cpp/comments/7j50cp/effective_modern_c17/). I am not sure why I even asked this, as code, despite being he "be all and end all" is actually the most trivial part of sotware development.  Btw, can hands dirty industry guys help you educators?  
> **username_5**: @username_0saysreinstateMonica They help at my institution.  They do curricular review with us as part of our long-term planning and oversight.  It's very helpful!  We also sometimes have professionals come and speak to the students about careers.  
> **username_3**: Us industry folk can be the problem: Making students learn Java and C++ before they can program. However Lean, test-driven, revision-control, Unix, Free-software, and a few other practices would not go a miss.  

---

