#include <iostream>
#include <string>

struct TestClass
{
    TestClass()
    {
        std::cout << "Instance has been constructed" << std::endl;
    }
    TestClass(const TestClass &from)
    {
        std::cout << "Copy has been constructed" << std::endl;
    }
    TestClass &operator=(const TestClass &from)
    {
        std::cout << "Assignment" << std::endl;
        return *this;
    }
    ~TestClass()
    {
        std::cout << "Instance has been destructed" << std::endl;
    }
};

typedef std::basic_string<TestClass> weird_string;

void Do1(weird_string t)
{
}
void Do2(weird_string &t)
{
}

int main()
{
    weird_string test(1,TestClass());
    std::cout << "Start of main" << std::endl;
    std::cout << "Do1:" << std::endl;
    Do1(test);
    std::cout << "Do2:" << std::endl;
    Do2(test);
    std::cout << "End of main" << std::endl;
}