#include <iostream>
 
struct test
{
    test()
    {
        std::cout << "test ctor\n";
    }
    ~test()
    {
        std::cout << "test dtor\n";
    }
};
 
struct Data {
    Data(const test &data = {}) : data_(data) 
    {
        std::cout << "data ctor\n";
    }
    ~Data()
    {
        std::cout << "data dtor\n";
    }
    const test &data_;
 
    void forceuse()
    {
        std::cout << "Using data\n";
    }
};
 
Data create3(const test &data = {}) {
    std::cout << "in create3\n";
    return Data(data); // good
}
 
int main() {
    {
        std::cout << "calling create3\n";
        auto data3 = create3(); // ok
        std::cout << "returned from create3\n";
        data3.forceuse();
    }
}
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IHRlc3QKewogICAgdGVzdCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJ0ZXN0IGN0b3JcbiI7CiAgICB9CiAgICB+dGVzdCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJ0ZXN0IGR0b3JcbiI7CiAgICB9Cn07CgpzdHJ1Y3QgRGF0YSB7CiAgICBEYXRhKGNvbnN0IHRlc3QgJmRhdGEgPSB7fSkgOiBkYXRhXyhkYXRhKSAKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImRhdGEgY3RvclxuIjsKICAgIH0KICAgIH5EYXRhKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImRhdGEgZHRvclxuIjsKICAgIH0KICAgIGNvbnN0IHRlc3QgJmRhdGFfOwoKICAgIHZvaWQgZm9yY2V1c2UoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiVXNpbmcgZGF0YVxuIjsKICAgIH0KfTsKCkRhdGEgY3JlYXRlMyhjb25zdCB0ZXN0ICZkYXRhID0ge30pIHsKICAgIHN0ZDo6Y291dCA8PCAiaW4gY3JlYXRlM1xuIjsKICAgIHJldHVybiBEYXRhKGRhdGEpOyAvLyBnb29kCn0KCmludCBtYWluKCkgewogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiY2FsbGluZyBjcmVhdGUzXG4iOwogICAgICAgIGF1dG8gZGF0YTMgPSBjcmVhdGUzKCk7IC8vIG9rCiAgICAgICAgc3RkOjpjb3V0IDw8ICJyZXR1cm5lZCBmcm9tIGNyZWF0ZTNcbiI7CiAgICAgICAgZGF0YTMuZm9yY2V1c2UoKTsKICAgIH0KfQo=