//******************************************************** // The following code example is taken from the book // C++ Move Semantics - The Complete Guide // by Nicolai M. Josuttis (www.josuttis.com) // http://www.cppmove.com // // The code is licensed under a // Creative Commons Attribution 4.0 International License // http://creativecommons.org/licenses/by/4.0/ //******************************************************** #include "card.hpp" #include #include #include void print(const Card& c) { std::string val{c.getValue()}; auto pos = val.find("-of-"); auto p2 = pos + 4; std::cout << val.substr(0, pos) << ' ' << val.substr(pos+4) << '\n'; } int main() { std::vector deck; for (auto suit : {"clubs", "spades", "hearts", "diamonds"}) { for (auto rank : {"seven", "eight", "nine", "ten", "jack", "queen", "king", "ace"}) { deck.push_back(rank + std::string{"-of-"} + suit); } } for (const auto& c : deck) { std::cout << c << '\n'; } print(deck[0]); // passing a valid object Card c{std::move(deck[0])}; // deck[0] has invalid state print(deck[0]); // passing an object with broken invariant deck[0] = Card{"ace-of-hearts"}; // deck[0] is valid again print(deck[0]); // passing a valid object }