#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=