#include <memory>
#include <type_traits>


template<typename T>
class Container  {
	T t;
public:
    Container() = default;

    Container(const Container& other) = default;
    
    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;
}