#include <iostream>

using namespace std;

class Test {
public:
    Test()             { cout << "Test()\n"; }
    Test(int x):val_(x){ cout << "Test(" << x << ")\n"; }
    Test(const Test& t):val_(t.val_) { cout << "Test(const Test& " << t.val_ << ")\n"; }
    Test(Test&&t)      :val_(t.val_) { t.val_ = 0; cout << "Test(const Test&& " << t.val_ << ")\n"; }
    Test& operator = (const Test& t)  {
        cout << "Test& operator = (const Test& " << t.val_ <<")\n";
        val_ = t.val_;
        return *this;}
    Test& operator = (Test&& t) {
        cout << "Test& operator = (const Test&&" << t.val_ <<")\n";
        val_ = t.val_; t.val_ = 0;
        return *this;}
    ~Test()           { cout << "~Test(" << val_ <<")\n"; }
    int val() const { return val_; }
private:
    int val_ = 0;
};


int main(int argc, const char * argv[])
{
    long long L, M;
    Test * t = reinterpret_cast<Test*>(&L);
    *t = Test(5);
    cout << "t->val() = " << t->val() << endl;
    cout << "-------\n";

    Test * u = new(&M) Test(6);
    cout << "u->val() = " << u->val() << endl;

}

