#include <iostream>
template< typename P >
struct T
{
P m;
explicit T( P f = P() ) :
m( f )
{
std::cout << "T::T()" << std::endl;
}
T( T const & f ) :
m( f.m )
{
std::cout << "T::T( const & )" << std::endl;
}
/* T & operator =( T const & f )
{
m = f.m;
std::cout << "T::operator=( const & )" << std::endl;
return ( *this );
}*/
T( T && f ) :
m( std::move( f.m ) )
{
std::cout << "T::T( && )" << std::endl;
}
/* T & operator =( T && f )
{
m = std::move( f.m );
std::cout << "T::operator=( && )" << std::endl;
return ( *this );
}*/
T & operator=( T f )
{
std::swap( f.m, m );
std::cout << "T::operator=( T )" << std::endl;
return ( *this );
}
};
template< typename P >
T< P > MakeT( P const & f )
{
return ( T< P >( f ) );
}
struct A
{
A()
{
}
A( A const & )
{
std::cout << "A::A( A const & )" << std::endl;
}
A & operator =( A const & )
{
std::cout << "A::operator=( A const & )" << std::endl;
return ( *this );
}
A( A && )
{
std::cout << "A::A( A && )" << std::endl;
}
A & operator =( A && )
{
std::cout << "A::operator=( A && )" << std::endl;
return ( *this );
}
~A()
{
std::cout << "A::~A()" << std::endl;
}
};
int main( void )
{
T< A > lt = MakeT( A() );
T< A > lt1;
std::cout << "------------------" << std::endl;
lt1 = MakeT( A() );
std::cout << "------------------" << std::endl;
return( 0 );
}