#include <iostream>

struct A
{
    A() { std::cout << this << ":\tA::A()\n"; }
    ~A() { std::cout << this << ":\tA::~A()\n"; }
};

struct C
{
    C() { std::cout << this << ":\tC::C()\n"; }
    C(const C&) { std::cout << this << ":\tC::C(const C&)\n"; }
    ~C() { std::cout << this << ":\tC::~C()\n"; }
};

struct B
{
public:
    operator A() const { return A(); }
    operator C() const { return C(); }
};

void f(A q) { std::cout << "In f, q's address is " << &q << '\n'; }
void g(C q) { std::cout << "In g, q's address is " << &q << '\n'; }

int main()
{
    B d1;
    f(d1);
    g(d1);
}