#include <iostream>
using namespace std;
struct foo {};
struct xyz {};
struct base {
base(foo) { cout << "base(foo)\n"; }
base(xyz) { cout << "base(xyz)\n"; }
base(const base&) { cout << "base(base) - cctor\n"; }
};
struct derived : base {
template<class... Args>
derived(Args&&... args) : base(forward<Args>(args)...) {
cout << __PRETTY_FUNCTION__ << endl;
}
template<class Arg>
derived(Arg&& arg) : base(arg) {
cout << __PRETTY_FUNCTION__ << endl;
}
template<class Arg>
derived(const Arg& arg) : base(arg) {
cout << __PRETTY_FUNCTION__ << endl;
}
derived(const derived& d) : base(d) { cout << "derived cctor\n"; }
derived(derived&& d) : base(d) { cout << "derived mctor\n"; }
derived(xyz x) : base(x) { cout << "derived(xyz)\n"; }
};
int main() {
derived d1((foo()));
cout << "-----" << endl;
derived d2((xyz()));
cout << "-----" << endl;
derived d3(d1);
cout << "-----" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGZvbyB7fTsKc3RydWN0IHh5eiB7fTsKCnN0cnVjdCBiYXNlIHsKCWJhc2UoZm9vKSB7IGNvdXQgPDwgImJhc2UoZm9vKVxuIjsgfQoJYmFzZSh4eXopIHsgY291dCA8PCAiYmFzZSh4eXopXG4iOyB9CgliYXNlKGNvbnN0IGJhc2UmKSB7IGNvdXQgPDwgImJhc2UoYmFzZSkgLSBjY3RvclxuIjsgfQp9OwoKc3RydWN0IGRlcml2ZWQgOiBiYXNlIHsKCXRlbXBsYXRlPGNsYXNzLi4uIEFyZ3M+CglkZXJpdmVkKEFyZ3MmJi4uLiBhcmdzKSA6IGJhc2UoZm9yd2FyZDxBcmdzPihhcmdzKS4uLikgewoJCWNvdXQgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCBlbmRsOwoJfQoKCXRlbXBsYXRlPGNsYXNzIEFyZz4KCWRlcml2ZWQoQXJnJiYgYXJnKSA6IGJhc2UoYXJnKSB7CgkJY291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8IGVuZGw7Cgl9CgoJdGVtcGxhdGU8Y2xhc3MgQXJnPgoJZGVyaXZlZChjb25zdCBBcmcmIGFyZykgOiBiYXNlKGFyZykgewoJCWNvdXQgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCBlbmRsOwoJfQoKCWRlcml2ZWQoY29uc3QgZGVyaXZlZCYgZCkgOiBiYXNlKGQpIHsgY291dCA8PCAiZGVyaXZlZCBjY3RvclxuIjsgfQoKCWRlcml2ZWQoZGVyaXZlZCYmIGQpIDogYmFzZShkKSB7IGNvdXQgPDwgImRlcml2ZWQgbWN0b3JcbiI7IH0KCQoJZGVyaXZlZCh4eXogeCkgOiBiYXNlKHgpIHsgY291dCA8PCAiZGVyaXZlZCh4eXopXG4iOyB9Cn07CgppbnQgbWFpbigpIHsKCWRlcml2ZWQgZDEoKGZvbygpKSk7Cgljb3V0IDw8ICItLS0tLSIgPDwgZW5kbDsKCWRlcml2ZWQgZDIoKHh5eigpKSk7Cgljb3V0IDw8ICItLS0tLSIgPDwgZW5kbDsKCWRlcml2ZWQgZDMoZDEpOwoJY291dCA8PCAiLS0tLS0iIDw8IGVuZGw7CglyZXR1cm4gMDsKfQ==