#include #include class copy_tracker { int v; public: copy_tracker() : v(0) { std::cout << "copy_tracker::copy_tracker()" << std::endl; } copy_tracker( const copy_tracker& c ) : v( c.v ) { std::cout << "copy_tracker::copy_tracker( copy_tracker& c )" << std::endl; } void use_object() const { std::cout << v << std::endl; } }; copy_tracker create_rvalue() { return copy_tracker(); } const copy_tracker create_const_rvalue() { return copy_tracker(); } void f ( copy_tracker&& o ) { o.use_object(); } void f_const ( const copy_tracker&& o ) { o.use_object(); } void aaa( const std::string& s ) { std::cout << s << std::endl; } int main( void ) { f( create_rvalue() ); f_const( create_rvalue() ); f_const( create_const_rvalue() ); copy_tracker lvalue; f( std::move(lvalue) ); f_const( std::move(lvalue) ); aaa( "aaaa"); return 0; }