#include <memory>
#include <type_traits>

struct unused;  // forward declaration only

template<class Container>
using const_ref_if_copy_constructible = typename std::conditional<
        std::is_copy_constructible<typename Container::value_type>::value,
        Container const&,
        unused>::type;
        
template<typename T>
class Container {
    T t;
public:
	typedef T value_type;
	
    Container() = default;

	Container(const_ref_if_copy_constructible<Container> other) : t(other.t) {}
    Container(Container&& other) : t(std::move(other.t)) {}
};

static_assert(std::is_copy_constructible<Container<int>>::value, "Non-Copyable");
static_assert(!std::is_copy_constructible<Container<std::unique_ptr<int>>>::value, "Copyable");

Container<std::unique_ptr<int>> makeNonCopyableContainer() {
    return Container<std::unique_ptr<int>>();
}

int main () { 
    Container<int> c1;
    Container<int> c2(c1);
    Container<std::unique_ptr<int>> c3;
    // This would generate compile error:
    // Container<std::unique_ptr<int>> c4(c3);
    Container<std::unique_ptr<int>> c5(makeNonCopyableContainer());
    return 0;
}