#include <iostream>

const int * funct(const int &x) { return &x; }

struct Integer {
	int value;
	Integer(const int &value) : value(value) { std::cout << "Created: " << this << std::endl; }
	~Integer() { std::cout << "Destroyed: " << this << std::endl; }
};

const Integer * funct2(const Integer &x) { return &x; }

int main()
{
	int a = 3, b = 4;

	// different addresses
	std::cout << funct(a) << std::endl;
	std::cout << funct(b) << std::endl;

	// same address
	std::cout << funct(3) << std::endl;
	std::cout << funct(4) << std::endl;

	// different addresses
	std::cout << funct(3) << std::endl << funct(4) << std::endl;

	std::cout << "----------" << std::endl;
	
	// same address
	std::cout << funct2(3) << std::endl;
	std::cout << funct2(4) << std::endl;

	// different addresses
	std::cout << funct2(3) << std::endl << funct2(4) << std::endl;
}