#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;
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIENvbnRhaW5lciAgewoJVCB0OwpwdWJsaWM6CiAgICBDb250YWluZXIoKSA9IGRlZmF1bHQ7CgogICAgQ29udGFpbmVyKGNvbnN0IENvbnRhaW5lciYgb3RoZXIpID0gZGVmYXVsdDsKICAgIAogICAgQ29udGFpbmVyKENvbnRhaW5lciYmIG90aGVyKSA6IHQoc3RkOjptb3ZlKG90aGVyLnQpKSB7fQp9OwoKc3RhdGljX2Fzc2VydChzdGQ6OmlzX2NvcHlfY29uc3RydWN0aWJsZTxDb250YWluZXI8aW50Pj46OnZhbHVlLCAiTm9uLUNvcHlhYmxlIik7CnN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfY29weV9jb25zdHJ1Y3RpYmxlPENvbnRhaW5lcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4+Ojp2YWx1ZSwgIkNvcHlhYmxlIik7CgpDb250YWluZXI8c3RkOjp1bmlxdWVfcHRyPGludD4+IG1ha2VOb25Db3B5YWJsZUNvbnRhaW5lcigpIHsKICAgIHJldHVybiBDb250YWluZXI8c3RkOjp1bmlxdWVfcHRyPGludD4+KCk7Cn0KCmludCBtYWluICgpIHsgCiAgICBDb250YWluZXI8aW50PiBjMTsKICAgIENvbnRhaW5lcjxpbnQ+IGMyKGMxKTsKICAgIENvbnRhaW5lcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4gYzM7CiAgICAvLyBUaGlzIHdvdWxkIGdlbmVyYXRlIGNvbXBpbGUgZXJyb3I6CiAgICAvLyBDb250YWluZXI8c3RkOjp1bmlxdWVfcHRyPGludD4+IGM0KGMzKTsKICAgIENvbnRhaW5lcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4gYzUobWFrZU5vbkNvcHlhYmxlQ29udGFpbmVyKCkpOwogICAgcmV0dXJuIDA7Cn0=