#include <iostream>

struct reporting {
	reporting() { std::cout << "Constructed" << std::endl;}
	~reporting() { std::cout << "Destructed" << std::endl;}
	reporting(reporting const&) { std::cout << "Copy-Constructed" << std::endl;}
	reporting(reporting &&) { std::cout << "Move-Constructed" << std::endl;}
	reporting & operator=(reporting const&) { std::cout << "Copy-Assigned" << std::endl; return *this;}
	reporting & operator=(reporting &&) { std::cout << "Move-Assigned" << std::endl; return *this;}
	
	void print() const {std::cout << "printing." << std::endl;}
};

const reporting& get_or(const reporting& def)
{
    return def;
}

int main()
{
    const reporting& foo = get_or(reporting{});

    foo.print();
    return 0;
}