#include <iostream>
using namespace std;


    template<class T0> struct value_wrapper {

        value_wrapper( T0* data_ ) {
        	std::cout << "value_wrapper( T0* data_ )" << std::endl;
        	data = data_; 
        }

        value_wrapper() {
        	std::cout << "value_wrapper()" << std::endl;
        	data = new T0{}; 
        }

        value_wrapper( const value_wrapper& other ) {
        	std::cout << "value_wrapper( const value_wrapper& other )" << std::endl;
        	data = new T0{}; 
        	*data = *other.data;
        }

        value_wrapper& operator=( const value_wrapper& other ) {
        	std::cout << "value_wrapper& operator=( const value_wrapper& other )" << std::endl;
            *data = *other.data;
        }

        ~value_wrapper() {
        	std::cout << "~value_wrapper()" << std::endl;
            delete data;
        }

        //move construction and assigment, other operators and member functions

        T0* data;
    };

//test class
struct value {
        value() { std::cout << "value()" << std::endl; }
	    value( const value& other ) { std::cout << "value( const value& other )" << std::endl; }
        value& operator=( const value& other ) { std::cout << "value& operator=( const value& other )" << std::endl; }
        ~value() { std::cout << "~value()" << std::endl; }
};


int main() {
	value_wrapper<value> v1{ new value{} };
	value_wrapper<value> v2{};
	v2 = v1;
}

