#include <iostream>
struct Foo {
Foo() = default;
Foo(Foo &&) {}
};
struct Bar {
Bar() = default;
//Bar(const Bar &) = default;
Bar(Bar &&) = default;
};
struct Empty
{};
Foo GetFoo() {
Foo foo;
std::cout << "GetFoo:" << &foo << std::endl;
return foo;
}
Bar GetBar() {
Bar bar;
std::cout << "GetBar:" << &bar << std::endl;
return bar;
}
Empty GetEmpty() {
Empty e;
std::cout << "GetEmpty:" << &e << std::endl;
return e;
}
int main() {
// RVO OK
Foo foo = GetFoo();
std::cout << "foo:" << &foo << std::endl<< std::endl;
// RVO GG
Bar bar = GetBar();
std::cout << "bar:" << &bar << std::endl<< std::endl;
// RVO GG
Empty empty = GetEmpty();
std::cout << "empty:" << &empty << std::endl<< std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEZvbyB7CglGb28oKSA9IGRlZmF1bHQ7CglGb28oRm9vICYmKSB7fQp9OwoKc3RydWN0IEJhciB7CglCYXIoKSA9IGRlZmF1bHQ7CgkvL0Jhcihjb25zdCBCYXIgJikgPSBkZWZhdWx0OwoJQmFyKEJhciAmJikgPSBkZWZhdWx0Owp9OwoKc3RydWN0IEVtcHR5Cnt9OwoKRm9vIEdldEZvbygpIHsKCUZvbyBmb287CglzdGQ6OmNvdXQgPDwgIkdldEZvbzoiIDw8ICZmb28gPDwgc3RkOjplbmRsOwoJcmV0dXJuIGZvbzsKfQoKQmFyIEdldEJhcigpIHsKCUJhciBiYXI7CglzdGQ6OmNvdXQgPDwgIkdldEJhcjoiIDw8ICZiYXIgPDwgc3RkOjplbmRsOwoJcmV0dXJuIGJhcjsKfQoKRW1wdHkgR2V0RW1wdHkoKSB7CglFbXB0eSBlOwoJc3RkOjpjb3V0IDw8ICJHZXRFbXB0eToiIDw8ICZlIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiBlOwp9CgppbnQgbWFpbigpIHsKCS8vIFJWTyBPSwoJRm9vIGZvbyA9IEdldEZvbygpOwoJc3RkOjpjb3V0IDw8ICJmb286IiA8PCAmZm9vIDw8IHN0ZDo6ZW5kbDw8IHN0ZDo6ZW5kbDsKCS8vIFJWTyBHRwoJQmFyIGJhciA9IEdldEJhcigpOwoJc3RkOjpjb3V0IDw8ICJiYXI6IiA8PCAmYmFyIDw8IHN0ZDo6ZW5kbDw8IHN0ZDo6ZW5kbDsKCS8vIFJWTyBHRwoJRW1wdHkgZW1wdHkgPSBHZXRFbXB0eSgpOwoJc3RkOjpjb3V0IDw8ICJlbXB0eToiIDw8ICZlbXB0eSA8PCBzdGQ6OmVuZGw8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQo=