#include <iostream>
struct CopyOnly
{
CopyOnly() = default;
CopyOnly(const CopyOnly&) = default;
CopyOnly(CopyOnly&&) = delete;
};
struct Verbose
{
Verbose() { std::cout << "default constructor" << std::endl; }
Verbose(const Verbose&) { std::cout << "copy constructor" << std::endl; }
Verbose(Verbose&&) { std::cout << "move constructor" << std::endl; }
};
struct A : CopyOnly, Verbose {};
void foo(A &&x){ std::cout<<"&&" <<std::endl; A a(std::move(x));}
void foo(A &x){ std::cout<<"&" <<std::endl; A a(x);}
int main() {
foo(A()); // prints &&
A a;
foo(a); // prints &
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IENvcHlPbmx5CnsKICAgIENvcHlPbmx5KCkgPSBkZWZhdWx0OwogICAgQ29weU9ubHkoY29uc3QgQ29weU9ubHkmKSA9IGRlZmF1bHQ7CiAgICBDb3B5T25seShDb3B5T25seSYmKSA9IGRlbGV0ZTsKfTsKCnN0cnVjdCBWZXJib3NlCnsKICAgIFZlcmJvc2UoKSB7IHN0ZDo6Y291dCA8PCAiZGVmYXVsdCBjb25zdHJ1Y3RvciIgPDwgc3RkOjplbmRsOyB9CiAgICBWZXJib3NlKGNvbnN0IFZlcmJvc2UmKSB7IHN0ZDo6Y291dCA8PCAiY29weSBjb25zdHJ1Y3RvciIgPDwgc3RkOjplbmRsOyB9CiAgICBWZXJib3NlKFZlcmJvc2UmJikgeyBzdGQ6OmNvdXQgPDwgIm1vdmUgY29uc3RydWN0b3IiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKc3RydWN0IEEgOiBDb3B5T25seSwgVmVyYm9zZSB7fTsKCnZvaWQgIGZvbyhBICYmeCl7IHN0ZDo6Y291dDw8IiYmIiA8PHN0ZDo6ZW5kbDsgQSBhKHN0ZDo6bW92ZSh4KSk7fQoKdm9pZCAgZm9vKEEgJngpeyBzdGQ6OmNvdXQ8PCImIiA8PHN0ZDo6ZW5kbDsgQSBhKHgpO30KCmludCBtYWluKCkgewogICAgZm9vKEEoKSk7IC8vIHByaW50cyAmJgogICAgQSBhOwogICAgZm9vKGEpOyAvLyBwcmludHMgJgogICAgcmV0dXJuIDA7Cn0K