#include <iostream>
#include <cstdlib>
using namespace std;
struct Noisy {
int n;
Noisy() :n(0) { cout << "Noisy()\n"; }
Noisy(const Noisy & o) :n(o.n) { cout << "copy Noisy\n"; }
Noisy(Noisy&& o) :n(o.n) { cout << "move Noisy\n"; }
};
Noisy foo(bool x)
{
Noisy a;
a.n = 5;
Noisy b;
b.n = 10;
// does this not exclude the possibility of copy elision?
if (x) return a;
else return b;
}
int main()
{
// does this not move? See output below
Noisy n = foo(rand()%2==0);
cout << n.n;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9pc3kgewogICAgICAgIGludCBuOwoJTm9pc3koKSA6bigwKSB7IGNvdXQgPDwgIk5vaXN5KClcbiI7IH0KCU5vaXN5KGNvbnN0IE5vaXN5ICYgbykgOm4oby5uKSB7IGNvdXQgPDwgImNvcHkgTm9pc3lcbiI7IH0KCU5vaXN5KE5vaXN5JiYgbykgOm4oby5uKSB7IGNvdXQgPDwgIm1vdmUgTm9pc3lcbiI7IH0KfTsKCk5vaXN5IGZvbyhib29sIHgpCnsKCU5vaXN5IGE7CglhLm4gPSA1OwoJTm9pc3kgYjsKCWIubiA9IDEwOwoKICAgICAgICAvLyBkb2VzIHRoaXMgbm90IGV4Y2x1ZGUgdGhlIHBvc3NpYmlsaXR5IG9mIGNvcHkgZWxpc2lvbj8KCWlmICh4KSByZXR1cm4gYTsKCWVsc2UgcmV0dXJuIGI7Cn0KCmludCBtYWluKCkKewogICAgICAgIC8vIGRvZXMgdGhpcyBub3QgbW92ZT8gIFNlZSBvdXRwdXQgYmVsb3cKCU5vaXN5IG4gPSBmb28ocmFuZCgpJTI9PTApOwoJY291dCA8PCBuLm47Cn0=