title: std::move changes address of variables?
body: <p>I found unexpected (at least for me) behavior. </p>
  
  <pre><code>class A
  {
      char  _text[100];
      char* _beg;
      char* _end;
  public:
      explicit A(char* text, size_t tsize) : _beg(&amp;text[0]), _end(&amp;text[std::min(tsize, 99)]) 
      {
          memcpy(_text, text, std::min(tsize, 99));
          *_end = '\0';
      }
      inline std::string get_text()
      {
          return std::move(std::string(_beg, _end));  
      }
  };
  </code></pre>
  
  <p>After that somewhere in code I do that:</p>
  
  <pre><code>  A* add_A(A&amp;&amp; a)
    {
       list_a.push_back(std::move(a));
       return &amp;(list_a.back());
    }
  
    std::list&lt;A&gt; list_a;
    {
        add_A(A("my_text", 7));
        list_a.back().get_text(); //returns "my_text"
    }
    list_a.back().get_text(); //returns trash
  </code></pre>
  
  <p>As only I move this class (using <code>std::move</code>), and call <code>get_text()</code> of object that was moved, I get trash, as if after movement address of variable <code>_text</code> changed, and so <code>_beg</code> and <code>_end</code> points to nowhere.</p>
  
  <p>Does address of variables really can be changes after <code>std::move</code> (I thought <code>move</code> don't really move object, it was invented for that)?</p>
  
  <p>If it can be changed, what is usual pattern to handle it (to change pointers accordingly)?</p>
  
  <p>If it can't be change, may that behavior happens because I try to move such object to <code>std::list</code> (and so there somehow happens copying, it changes address of variables and makes pointers point to wrong positions)?</p>