#include <queue>
#include <utility>
template <typename T>
class myqueue {
public:
myqueue() : q() {}
myqueue(myqueue const&) = delete;
virtual ~myqueue() {}
// pushes a copy
void push(const T& item) {
q.push(item);
}
// pushes the object itself (move)
void push(T&& item) {
q.push(std::move(item));
}
private:
std::queue<T> q;
};
class nocopy {
public:
// Default constructor
nocopy() {}
// Move semantics
nocopy(nocopy&& other) {}
nocopy& operator=(nocopy&& rhs) {
nocopy(std::move(rhs)).swap(*this);
return *this;
}
// Disable copy semantics
nocopy(const nocopy& other) = delete;
nocopy& operator=(const nocopy& rhs) = delete;
void swap(const nocopy& other) {}
};
int main() {
myqueue<int> q1; // compiles fine.
q1.push(1);
std::queue<nocopy> q2; // compiles fine.
nocopy nc1;
q2.push(std::move(nc1));
myqueue<nocopy> q3; // ERROR :(
nocopy nc2;
q3.push(std::move(nc2));
}
I2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBteXF1ZXVlIHsKcHVibGljOgogICAgbXlxdWV1ZSgpIDogcSgpIHt9CiAgICBteXF1ZXVlKG15cXVldWUgY29uc3QmKSA9IGRlbGV0ZTsKICAgIHZpcnR1YWwgfm15cXVldWUoKSB7fQoKICAgIC8vIHB1c2hlcyBhIGNvcHkKICAgIHZvaWQgcHVzaChjb25zdCBUJiBpdGVtKSB7CiAgICAgICAgcS5wdXNoKGl0ZW0pOwogICAgfQogICAgLy8gcHVzaGVzIHRoZSBvYmplY3QgaXRzZWxmIChtb3ZlKQogICAgdm9pZCBwdXNoKFQmJiBpdGVtKSB7CiAgICAgICAgcS5wdXNoKHN0ZDo6bW92ZShpdGVtKSk7CiAgICB9CnByaXZhdGU6CiAgICBzdGQ6OnF1ZXVlPFQ+IHE7Cn07CgpjbGFzcyBub2NvcHkgewpwdWJsaWM6CiAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICBub2NvcHkoKSB7fQoKICAgIC8vIE1vdmUgc2VtYW50aWNzCiAgICBub2NvcHkobm9jb3B5JiYgb3RoZXIpIHt9CiAgICBub2NvcHkmIG9wZXJhdG9yPShub2NvcHkmJiByaHMpIHsKICAgICAgICBub2NvcHkoc3RkOjptb3ZlKHJocykpLnN3YXAoKnRoaXMpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICAvLyBEaXNhYmxlIGNvcHkgc2VtYW50aWNzCiAgICBub2NvcHkoY29uc3Qgbm9jb3B5JiBvdGhlcikgPSBkZWxldGU7CiAgICBub2NvcHkmIG9wZXJhdG9yPShjb25zdCBub2NvcHkmIHJocykgPSBkZWxldGU7CgogICAgdm9pZCBzd2FwKGNvbnN0IG5vY29weSYgb3RoZXIpIHt9Cn07CgppbnQgbWFpbigpIHsKICAgIG15cXVldWU8aW50PiBxMTsgLy8gY29tcGlsZXMgZmluZS4KICAgIHExLnB1c2goMSk7CgogICAgc3RkOjpxdWV1ZTxub2NvcHk+IHEyOyAvLyBjb21waWxlcyBmaW5lLgogICAgbm9jb3B5IG5jMTsKICAgIHEyLnB1c2goc3RkOjptb3ZlKG5jMSkpOwoKICAgIG15cXVldWU8bm9jb3B5PiBxMzsgLy8gRVJST1IgOigKICAgIG5vY29weSBuYzI7CiAgICBxMy5wdXNoKHN0ZDo6bW92ZShuYzIpKTsKfQoKCg==