#include <iostream>
#include <utility>
using namespace std;
template <typename T>
struct container
{
container(const T& ref) : _item(ref)
{
cout << "Const ref constructor" << endl;
}
template <typename U>
container(U&& ref) : _item(std::forward<U>(ref))
{
cout << "Universal ref constructor!" << endl;
}
T _item;
};
struct Complex
{
char content[10];
};
struct NotMovable
{
NotMovable() {}
NotMovable(const NotMovable&) {}
NotMovable(NotMovable&&) = delete;
char content[10];
};
int main() {
int var = 5;
container<int> intTest1(var);
container<int> intTest2(std::move(var));
container<int> intTest3(10);
Complex comp{};
container<Complex> compTest1(comp);
container<Complex> compTest2(std::move(comp));
container<Complex> compTest3(Complex{});
NotMovable nm{};
container<NotMovable> nmTest1(nm);
// container<NotMovable> nmTest2(std::move(nm)); Won't compile
// container<NotMovable> nmTest3(NotMovable{}); Won't compile, not sure why though
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgY29udGFpbmVyCnsKCWNvbnRhaW5lcihjb25zdCBUJiByZWYpIDogX2l0ZW0ocmVmKQoJewoJCWNvdXQgPDwgIkNvbnN0IHJlZiBjb25zdHJ1Y3RvciIgPDwgZW5kbDsKCX0KCQoJdGVtcGxhdGUgPHR5cGVuYW1lIFU+Cgljb250YWluZXIoVSYmIHJlZikgOiBfaXRlbShzdGQ6OmZvcndhcmQ8VT4ocmVmKSkKCXsKCQljb3V0IDw8ICJVbml2ZXJzYWwgcmVmIGNvbnN0cnVjdG9yISIgPDwgZW5kbDsKCX0KCQoJVCBfaXRlbTsKfTsKCnN0cnVjdCBDb21wbGV4CnsKICAgIGNoYXIgY29udGVudFsxMF07Cn07CgpzdHJ1Y3QgTm90TW92YWJsZQp7CglOb3RNb3ZhYmxlKCkge30KCU5vdE1vdmFibGUoY29uc3QgTm90TW92YWJsZSYpIHt9CglOb3RNb3ZhYmxlKE5vdE1vdmFibGUmJikgPSBkZWxldGU7CgkKCWNoYXIgY29udGVudFsxMF07Cn07CgppbnQgbWFpbigpIHsKCWludCB2YXIgPSA1OwoJY29udGFpbmVyPGludD4gaW50VGVzdDEodmFyKTsKCWNvbnRhaW5lcjxpbnQ+IGludFRlc3QyKHN0ZDo6bW92ZSh2YXIpKTsKCWNvbnRhaW5lcjxpbnQ+IGludFRlc3QzKDEwKTsKCQoJQ29tcGxleCBjb21we307Cgljb250YWluZXI8Q29tcGxleD4gY29tcFRlc3QxKGNvbXApOwoJY29udGFpbmVyPENvbXBsZXg+IGNvbXBUZXN0MihzdGQ6Om1vdmUoY29tcCkpOwoJY29udGFpbmVyPENvbXBsZXg+IGNvbXBUZXN0MyhDb21wbGV4e30pOwoJCglOb3RNb3ZhYmxlIG5te307Cgljb250YWluZXI8Tm90TW92YWJsZT4gbm1UZXN0MShubSk7CgkvLyBjb250YWluZXI8Tm90TW92YWJsZT4gbm1UZXN0MihzdGQ6Om1vdmUobm0pKTsgV29uJ3QgY29tcGlsZQoJLy8gY29udGFpbmVyPE5vdE1vdmFibGU+IG5tVGVzdDMoTm90TW92YWJsZXt9KTsgV29uJ3QgY29tcGlsZSwgbm90IHN1cmUgd2h5IHRob3VnaAoJCgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==