#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 );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8IHR5cGVuYW1lIFAgPgpzdHJ1Y3QgVAp7CiAgICBQIG07CiAgICBleHBsaWNpdCBUKCBQIGYgPSBQKCkgKSA6CgltKCBmICkKICAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJUOjpUKCkiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIFQoIFQgY29uc3QgJiBmICkgOgoJbSggZi5tICkKICAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJUOjpUKCBjb25zdCAmICkiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgICAgICBUICYgb3BlcmF0b3IgPSggVCBjb25zdCAmIGYgKQogICAgIHsKICAgICBtID0gZi5tOwogICAgIHN0ZDo6Y291dCA8PCAiVDo6b3BlcmF0b3I9KCBjb25zdCAmICkiIDw8IHN0ZDo6ZW5kbDsKICAgICByZXR1cm4gKCAqdGhpcyApOwogICAgIH0KICAgIFQoIFQgJiYgZiApIDoKCW0oIHN0ZDo6bW92ZSggZi5tICkgKQogICAgewogICAgICBzdGQ6OmNvdXQgPDwgIlQ6OlQoICYmICkiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgICAgICBUICYgb3BlcmF0b3IgPSggVCAmJiBmICkKICAgICB7CiAgICAgbSA9IHN0ZDo6bW92ZSggZi5tICk7CiAgICAgc3RkOjpjb3V0IDw8ICJUOjpvcGVyYXRvcj0oICYmICkiIDw8IHN0ZDo6ZW5kbDsKICAgICByZXR1cm4gKCAqdGhpcyApOwogICAgIH0KCi8qICAgIFQgJiBvcGVyYXRvcj0oIFQgZiApCiAgICB7CiAgICAgIHN0ZDo6c3dhcCggZi5tLCBtICk7CiAgICAgIHN0ZDo6Y291dCA8PCAiVDo6b3BlcmF0b3I9KCBUICkiIDw8IHN0ZDo6ZW5kbDsKCiAgICAgIHJldHVybiAoICp0aGlzICk7CiAgICB9Ki8KfTsKCnRlbXBsYXRlPCB0eXBlbmFtZSBQID4KVDwgUCA+IE1ha2VUKCBQIGNvbnN0ICYgZiApCnsKICByZXR1cm4gKCBUPCBQID4oIGYgKSApOwp9CgpzdHJ1Y3QgQQp7CiAgICBBKCkKICAgIHsKICAgIH0KICAgIEEoIEEgY29uc3QgJiApCiAgICB7CiAgICAgIHN0ZDo6Y291dCA8PCAiQTo6QSggQSBjb25zdCAmICkiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIEEgJiBvcGVyYXRvciA9KCBBIGNvbnN0ICYgKQogICAgewogICAgICBzdGQ6OmNvdXQgPDwgIkE6Om9wZXJhdG9yPSggQSBjb25zdCAmICkiIDw8IHN0ZDo6ZW5kbDsKICAgICAgcmV0dXJuICggKnRoaXMgKTsKICAgIH0KICAgIEEoIEEgJiYgKQogICAgewogICAgICBzdGQ6OmNvdXQgPDwgIkE6OkEoIEEgJiYgKSIgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIEEgJiBvcGVyYXRvciA9KCBBICYmICkKICAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJBOjpvcGVyYXRvcj0oIEEgJiYgKSIgPDwgc3RkOjplbmRsOwogICAgICByZXR1cm4gKCAqdGhpcyApOwogICAgfQogICAgfkEoKQogICAgewogICAgICBzdGQ6OmNvdXQgPDwgIkE6On5BKCkiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmludCBtYWluKCB2b2lkICkKewogIFQ8IEEgPiBsdCA9IE1ha2VUKCBBKCkgKTsKICBUPCBBID4gbHQxOwogIHN0ZDo6Y291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tIiA8PCBzdGQ6OmVuZGw7CiAgbHQxID0gTWFrZVQoIEEoKSApOwogIHN0ZDo6Y291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tIiA8PCBzdGQ6OmVuZGw7CgogcmV0dXJuKCAwICk7Cn0K