fork download
  1. #include <iostream>
  2. #include <utility>
  3.  
  4. using namespace std;
  5.  
  6. struct foo {
  7. explicit foo(char const* s) : m_str(s) { cout << "init " << m_str << "\n"; }
  8. foo(foo const& other) : m_str(other.m_str) { cout << "copy " << m_str << "\n"; }
  9. foo(foo&& other) : m_str(other.m_str) { cout << "move " << m_str << "\n"; }
  10. ~foo() { cout << "destroy " << m_str << "\n"; }
  11.  
  12. foo& operator = (foo const& other) { m_str = other.m_str; cout << "copy-assign " << m_str << "\n"; return *this; }
  13. foo& operator = (foo&& other) { m_str = other.m_str; cout << "move-assign " << m_str << "\n"; return *this; }
  14.  
  15. private:
  16. char const* m_str;
  17. };
  18.  
  19. foo good() { return foo("good"); }
  20. foo const bad() { return foo("bad"); }
  21.  
  22. void consume(foo) { }
  23.  
  24. template <class T> void consume2(T&& t) {
  25. consume(forward<T>(t));
  26. }
  27.  
  28. int main()
  29. {
  30. consume2(good());
  31. cout << "\n";
  32. consume2(bad());
  33. // cout << "\n";
  34. // good() = foo("nicht so gut");
  35. }
  36.  
Success #stdin #stdout 0s 2928KB
stdin
Standard input is empty
stdout
init good
move good
destroy good
destroy good

init bad
copy bad
destroy bad
destroy bad