Am I using copy ctors/move ctors/shared_ptr correctly?
Firstly, in your header file, you don't need the Hero:: qualification on your move assignment operator. Secondly, you are defining it as Hero&amp; Hero::operator=(const Hero &amp;&amp;hero);. Think about what this is saying - it's saying if you have an rvalue reference to a Hero object, then:


You cannot modify it because it is const
You want to utilize move semantics (specifically, std::move) which will modify the original object and leave it with an empty value.


Hence, your move constructor should always be of the form Hero&amp; Hero::operator=(Hero&amp;&amp; hero). The implementation should also be using std::move:

Hero&amp; operator=(Hero&amp;&amp; hero)
    : id(std::move(hero.id),
      name(std::move(hero.name),
      level(std::move(hero.level)
{ }


For your AddHero methods, a Hero&amp;&amp; hero might be an rvalue reference, but without the std::move for its elements, you're basically saying "take an rvalue reference to Hero, and call copy constructors on each of its elements when you utilize make_shared&lt;Hero&gt;".

Note that moving vs copying for basic types like int or long won't have any performance difference.

That being said, you're doing a lot of work here for no benefit. The rule is, unless you have written a custom destructor, you don't need to write custom copy constructors, copy assignment operators or move assignment operators - the compiler will generate defaults which are correct. It is only when you are managing memory (hence have a delete or delete[] in a destructor somewhere) that you need to implement these.

Finally, a few other small points. Your constructors should be taking strings by const &amp;, ie, explicit Race(const std::string&amp; name). Usage of this-&gt; to return member variables is a bit unidiomatic in C++, likewise in copy constructors and the like, instead of this-&gt;id = hero.id; it's more idiomatic to simply write id = hero.id;. 

I'd suggest reading the Rule of Three post on stackoverflow to get a better understanding of copy construction and copy assignment.