#include <memory>	// for unique_ptr.
#include <type_traits>


template<typename value_type>
class unko
{
public:
	unko(value_type const &val) : sumapo{ new value_type{ val } } {}

	auto get() const -> value_type &
	{
		return *this->sumapo.get();
	}

	auto get() -> value_type &
	{
		static_assert(!std::is_const<value_type>::value, "kuso shite nero(unko must be const)");
		return *this->sumapo.get();
	}

private:
	std::unique_ptr<value_type> sumapo;
};

auto main() -> int
{
	{
		unko<int> a{ 20 }; int &i1 = a.get();
		unko<int> const b{ 20 }; int &i2 = b.get();
//		unko<int const> c{ 20 }; int const &i3 = c.get();
		unko<int const> const d{ 20 }; int const &i4 = d.get();
	}
}
