fork download
  1. #include <iostream>
  2.  
  3. template< typename P >
  4. struct T
  5. {
  6. P m;
  7. explicit T( P f = P() ) :
  8. m( f )
  9. {
  10. std::cout << "T::T()" << std::endl;
  11. }
  12. T( T const & f ) :
  13. m( f.m )
  14. {
  15. std::cout << "T::T( const & )" << std::endl;
  16. }
  17. T & operator =( T const & f )
  18. {
  19. m = f.m;
  20. std::cout << "T::operator=( const & )" << std::endl;
  21. return ( *this );
  22. }
  23. T( T && f ) :
  24. m( std::move( f.m ) )
  25. {
  26. std::cout << "T::T( && )" << std::endl;
  27. }
  28. T & operator =( T && f )
  29. {
  30. m = std::move( f.m );
  31. std::cout << "T::operator=( && )" << std::endl;
  32. return ( *this );
  33. }
  34.  
  35. /* T & operator=( T f )
  36.   {
  37.   std::swap( f.m, m );
  38.   std::cout << "T::operator=( T )" << std::endl;
  39.  
  40.   return ( *this );
  41.   }*/
  42. };
  43.  
  44. template< typename P >
  45. T< P > MakeT( P const & f )
  46. {
  47. return ( T< P >( f ) );
  48. }
  49.  
  50. struct A
  51. {
  52. A()
  53. {
  54. }
  55. A( A const & )
  56. {
  57. std::cout << "A::A( A const & )" << std::endl;
  58. }
  59. A & operator =( A const & )
  60. {
  61. std::cout << "A::operator=( A const & )" << std::endl;
  62. return ( *this );
  63. }
  64. A( A && )
  65. {
  66. std::cout << "A::A( A && )" << std::endl;
  67. }
  68.  
  69. A & operator =( A && )
  70. {
  71. std::cout << "A::operator=( A && )" << std::endl;
  72. return ( *this );
  73. }
  74. ~A()
  75. {
  76. std::cout << "A::~A()" << std::endl;
  77. }
  78. };
  79.  
  80. int main( void )
  81. {
  82. T< A > lt = MakeT( A() );
  83. T< A > lt1;
  84. std::cout << "------------------" << std::endl;
  85. lt1 = MakeT( A() );
  86. std::cout << "------------------" << std::endl;
  87.  
  88. return( 0 );
  89. }
  90.  
Success #stdin #stdout 0s 2832KB
stdin
Standard input is empty
stdout
A::A( A const & )
A::A( A const & )
T::T()
A::~A()
A::~A()
A::A( A const & )
T::T()
A::~A()
------------------
A::A( A const & )
A::A( A const & )
T::T()
A::~A()
A::operator=( A && )
T::operator=( && )
A::~A()
A::~A()
------------------
A::~A()
A::~A()