#include <algorithm>
#include <type_traits>
using namespace std;
template <typename Data>
class Container
{
public:
typedef Container<Data> self_type;
Container():
m_data()
{
}
template <class D = Data>
Container(const typename std::enable_if<std::is_copy_constructible<D>::value,
self_type>::type& other_data) :
m_data(other_data.m_data)
{
}
Container(self_type&& other)
{
std::swap(m_data, other.m_data);
}
private:
Data m_data;
};
class SomeData
{
public:
SomeData(){}
SomeData(const SomeData&) = delete;
};
int main()
{
Container<SomeData> container;
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhPgpjbGFzcyBDb250YWluZXIKewpwdWJsaWM6IAoJdHlwZWRlZiBDb250YWluZXI8RGF0YT4gc2VsZl90eXBlOwoJCglDb250YWluZXIoKTogCgkJbV9kYXRhKCkKCXsKCX0KCQoJdGVtcGxhdGUgPGNsYXNzIEQgPSBEYXRhPgoJQ29udGFpbmVyKGNvbnN0IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29weV9jb25zdHJ1Y3RpYmxlPEQ+Ojp2YWx1ZSwgCgkJCXNlbGZfdHlwZT46OnR5cGUmIG90aGVyX2RhdGEpIDogCgkJbV9kYXRhKG90aGVyX2RhdGEubV9kYXRhKQoJewoJfQoJCglDb250YWluZXIoc2VsZl90eXBlJiYgb3RoZXIpCgl7CgkJc3RkOjpzd2FwKG1fZGF0YSwgb3RoZXIubV9kYXRhKTsKCX0KCQpwcml2YXRlOgoJRGF0YSBtX2RhdGE7Cn07CgpjbGFzcyBTb21lRGF0YQp7CnB1YmxpYzoKICAgIFNvbWVEYXRhKCl7fQoJU29tZURhdGEoY29uc3QgU29tZURhdGEmKSA9IGRlbGV0ZTsKfTsKCmludCBtYWluKCkgCnsKCUNvbnRhaW5lcjxTb21lRGF0YT4gY29udGFpbmVyOwoJcmV0dXJuIDA7Cn0=