#include <iostream>
#include <thread>
 
class Foo {
public:
    Foo(Foo&& f) {
        std::cout << "Constructor Foo&& called: " << this << std::endl;
    }
    Foo(const Foo& f) {
        std::cout << "Constructor const Foo& called: " << this << std::endl;
    }
    Foo(void) {
        std::cout << "Constructor called: " << this << std::endl;
    }
    ~Foo(void) {
        std::cout << "Destructor called: " << this << std::endl;
    }
    void operator()() const {
        std::cout << "Operatior called: " << this << std::endl;
    }
};
 
void test_normal(void) {
    std::cout << "====> Standard example:" << std::endl;
    Foo f;
}
 
void test_thread(void) {
    std::cout << "====> Thread example:" << std::endl;
    Foo f;
    std::thread t(f);
    t.detach();
}
 
 
int main(int argc, char **argv) 
{
    test_normal();
    test_thread();
 
    for(;;);
}
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgoKY2xhc3MgRm9vIHsKcHVibGljOgogICAgRm9vKEZvbyYmIGYpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNvbnN0cnVjdG9yIEZvbyYmIGNhbGxlZDogIiA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIEZvbyhjb25zdCBGb28mIGYpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNvbnN0cnVjdG9yIGNvbnN0IEZvbyYgY2FsbGVkOiAiIDw8IHRoaXMgPDwgc3RkOjplbmRsOwogICAgfQogICAgRm9vKHZvaWQpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNvbnN0cnVjdG9yIGNhbGxlZDogIiA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIH5Gb28odm9pZCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRGVzdHJ1Y3RvciBjYWxsZWQ6ICIgPDwgdGhpcyA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJPcGVyYXRpb3IgY2FsbGVkOiAiIDw8IHRoaXMgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKdm9pZCB0ZXN0X25vcm1hbCh2b2lkKSB7CiAgICBzdGQ6OmNvdXQgPDwgIj09PT0+IFN0YW5kYXJkIGV4YW1wbGU6IiA8PCBzdGQ6OmVuZGw7CiAgICBGb28gZjsKfQoKdm9pZCB0ZXN0X3RocmVhZCh2b2lkKSB7CiAgICBzdGQ6OmNvdXQgPDwgIj09PT0+IFRocmVhZCBleGFtcGxlOiIgPDwgc3RkOjplbmRsOwogICAgRm9vIGY7CiAgICBzdGQ6OnRocmVhZCB0KGYpOwogICAgdC5kZXRhY2goKTsKfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgCnsKICAgIHRlc3Rfbm9ybWFsKCk7CiAgICB0ZXN0X3RocmVhZCgpOwoKICAgIGZvcig7Oyk7Cn0K