#include <iostream>
#include <utility>
using namespace std;

struct LogMe {
	std::string member;

	LogMe() {
		cout << __FUNCTION__ << " - def.ctor!" << endl;
	}
	~LogMe() {
		cout << __FUNCTION__ << " - dtor!" << endl;
	}
	LogMe(LogMe const&) {
		cout << __FUNCTION__ << " - cpy.ctor!" << endl;
	}
	LogMe& operator=(LogMe const&) {
		cout << __FUNCTION__ << " - cpy.assign.op!" << endl;
		return *this;
	}
	LogMe(LogMe&&) {
		cout << __FUNCTION__ << " - move.ctor!" << endl;
	}
	LogMe& operator=(LogMe&&) {
		cout << __FUNCTION__ << " - move.assign.op!" << endl;
		return *this;
	}
};

int main() {
	cout << "# Construct Object via auto obj = ...\n";
	auto obj = LogMe();
	cout << "# Construct pair<int, object> via auto objp = ...\n";
	auto objp = pair<int, LogMe>();
	cout << "# Construct pair<int, object> via pair objp2; ...\n";
	pair<int, LogMe> p2;

	return 0;
}