#include <iostream>
#include <stdexcept>
struct Foo
{
Foo(const Foo&) { std::cout << "Foo(const Foo&)\n";}
Foo(Foo&&) { std::cout << "Foo(Foo&&)\n";}
Foo() { std::cout << "Foo()\n";}
Foo& operator=(const Foo&) {
std::cout << "operator=(const Foo&)\n";
return *this;
}
Foo& operator=(Foo&&) {
std::cout << "operator=(Foo&&)\n";
return *this;
}
};
Foo foo(int i)
{
if (i<0)
{
throw std::out_of_range("Foo fail!");
}
else
{
return Foo();
}
}
int main()
{
Foo f = foo(1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgpzdHJ1Y3QgRm9vCnsKICBGb28oY29uc3QgRm9vJikgeyBzdGQ6OmNvdXQgPDwgIkZvbyhjb25zdCBGb28mKVxuIjt9CiAgRm9vKEZvbyYmKSB7IHN0ZDo6Y291dCA8PCAiRm9vKEZvbyYmKVxuIjt9CiAgRm9vKCkgeyBzdGQ6OmNvdXQgPDwgIkZvbygpXG4iO30KICBGb28mIG9wZXJhdG9yPShjb25zdCBGb28mKSB7IAogICAgc3RkOjpjb3V0IDw8ICJvcGVyYXRvcj0oY29uc3QgRm9vJilcbiI7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIEZvbyYgb3BlcmF0b3I9KEZvbyYmKSB7IAogICAgc3RkOjpjb3V0IDw8ICJvcGVyYXRvcj0oRm9vJiYpXG4iOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCkZvbyBmb28oaW50IGkpCnsKICBpZiAoaTwwKQogIHsKICAgIHRocm93IHN0ZDo6b3V0X29mX3JhbmdlKCJGb28gZmFpbCEiKTsKICB9CiAgZWxzZQogIHsKICAgIHJldHVybiBGb28oKTsKICB9Cn0KCmludCBtYWluKCkKewogIEZvbyBmID0gZm9vKDEpOwp9Cg==