#include <iostream>
using namespace std;
struct A
{
explicit A(int a, float b) :ma(a), mb(b) {
std::cout << "ctor" << std::endl;
}
A(const A& o) : ma(o.ma), mb(o.mb)
{
std::cout << "copied" << std::endl;
}
A(A&& o) : ma(o.ma), mb(o.mb)
{
std::cout << "moved" << std::endl;
}
A(const A&& o) : ma(o.ma), mb(o.mb)
{
std::cout << "const moved" << std::endl;
}
int ma; float mb;
};
const A blu()
{
A a(1, 2.3f);
return a;
}
A Blab()
{
A a( 2, 5.6f);
return a;
}
void ble(A a)
{
std::cout << a.ma << a.mb << std::endl;
}
int main() {
{
std::cout << "call const:" << std::endl;
ble( blu() );
}
{
std::cout << "call const move:" << std::endl;
ble( std::move(blu()));
}
{
std::cout << "call const &:" << std::endl;
ble( blu());
}
{
std::cout << "call non-const:" << std::endl;
ble( Blab());
}
{
std::cout << "call non-const move:" << std::endl;
ble( std::move(Blab()));
}
{
std::cout << "call non-const &:" << std::endl;
ble( Blab());
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEEKewoJZXhwbGljaXQgQShpbnQgYSwgZmxvYXQgYikgOm1hKGEpLCBtYihiKSB7CgkJc3RkOjpjb3V0IDw8ICJjdG9yIiA8PCBzdGQ6OmVuZGw7Cgl9CglBKGNvbnN0IEEmIG8pIDogbWEoby5tYSksIG1iKG8ubWIpCgl7CgkJc3RkOjpjb3V0IDw8ICJjb3BpZWQiIDw8IHN0ZDo6ZW5kbDsKCX0KCUEoQSYmIG8pIDogbWEoby5tYSksIG1iKG8ubWIpCgl7CgkJc3RkOjpjb3V0IDw8ICJtb3ZlZCIgPDwgc3RkOjplbmRsOwoJfQoJQShjb25zdCBBJiYgbykgOiBtYShvLm1hKSwgbWIoby5tYikKCXsKCQlzdGQ6OmNvdXQgPDwgImNvbnN0IG1vdmVkIiA8PCBzdGQ6OmVuZGw7Cgl9CglpbnQgbWE7IGZsb2F0IG1iOwp9OwoKY29uc3QgQSBibHUoKQp7CglBIGEoMSwgMi4zZik7CglyZXR1cm4gYTsKfQoKQSBCbGFiKCkKewoJQSBhKCAyLCA1LjZmKTsKCXJldHVybiBhOwp9Cgp2b2lkIGJsZShBIGEpCnsKCXN0ZDo6Y291dCA8PCBhLm1hIDw8IGEubWIgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpIHsKCXsKCQlzdGQ6OmNvdXQgPDwgImNhbGwgY29uc3Q6IiA8PCBzdGQ6OmVuZGw7CgkJYmxlKCBibHUoKSApOwoJfQoJewoJCXN0ZDo6Y291dCA8PCAiY2FsbCBjb25zdCBtb3ZlOiIgPDwgc3RkOjplbmRsOwoJCWJsZSggc3RkOjptb3ZlKGJsdSgpKSk7Cgl9Cgl7CgkJc3RkOjpjb3V0IDw8ICJjYWxsIGNvbnN0ICY6IiA8PCBzdGQ6OmVuZGw7CgkJYmxlKCBibHUoKSk7Cgl9Cgl7CgkJc3RkOjpjb3V0IDw8ICJjYWxsIG5vbi1jb25zdDoiIDw8IHN0ZDo6ZW5kbDsKCQlibGUoIEJsYWIoKSk7Cgl9Cgl7CgkJc3RkOjpjb3V0IDw8ICJjYWxsIG5vbi1jb25zdCBtb3ZlOiIgPDwgc3RkOjplbmRsOwoJCWJsZSggc3RkOjptb3ZlKEJsYWIoKSkpOwoJfQoJewoJCXN0ZDo6Y291dCA8PCAiY2FsbCBub24tY29uc3QgJjoiIDw8IHN0ZDo6ZW5kbDsKCQlibGUoIEJsYWIoKSk7Cgl9CgkKCXJldHVybiAwOwp9