#include <iostream>
#include <type_traits>

template <typename T>
struct vec;

template <typename T, bool B>
struct vec_impl;

template <typename T>
struct vec_impl<T, true> {
	static void add(const vec<T>& self, const T& a) {
		T n(a);
	}
};

template <typename T>
class vec {
	friend struct vec_impl<T, true>;
	
public:
	virtual void add(const T& a) {
		vec_impl<T, std::is_copy_constructible<T>::value>::add(*this, a);
	}

	virtual void add(T&& a) {
		
	}
};

struct mov {
	mov() = default;
	mov(const mov&) = delete;
	mov(mov&&) = default;
};

int main() {
	mov m;
	
	vec<mov> v;
	
	v.add(std::move(m));

	return 0;
}