#include <iostream>
struct Base
{
Base(){}
Base(const Base&) { std::cout << "gotcha\n"; }
};
void test(const Base&)
{
static int i = 0;
std::cout << "Done test " << ++i << "\n";
}
struct Derived : Base
{
};
struct Foo
{
operator Derived() { return Derived(); }
static Derived moo() { return Derived(); }
};
int main()
{
test(Foo());
test(Derived());
test(Foo::moo());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCnN0cnVjdCBCYXNlCnsKICAgIEJhc2UoKXt9CiAgICBCYXNlKGNvbnN0IEJhc2UmKSB7IHN0ZDo6Y291dCA8PCAiZ290Y2hhXG4iOyB9Cn07Cgp2b2lkIHRlc3QoY29uc3QgQmFzZSYpCnsKICBzdGF0aWMgaW50IGkgPSAwOwogIHN0ZDo6Y291dCA8PCAiRG9uZSB0ZXN0ICIgPDwgKytpIDw8ICJcbiI7Cn0KCnN0cnVjdCBEZXJpdmVkIDogQmFzZQp7Cn07CgpzdHJ1Y3QgRm9vCnsKICAgIG9wZXJhdG9yIERlcml2ZWQoKSB7IHJldHVybiBEZXJpdmVkKCk7IH0KICAgIHN0YXRpYyBEZXJpdmVkIG1vbygpIHsgcmV0dXJuIERlcml2ZWQoKTsgfQp9OwoKaW50IG1haW4oKQp7CiAgICB0ZXN0KEZvbygpKTsKICAgIHRlc3QoRGVyaXZlZCgpKTsKICAgIHRlc3QoRm9vOjptb28oKSk7Cn0K