#include <queue>
#include <utility>
template <typename T>
class myqueue {
public:
myqueue() : q() {}
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));
}
I2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBteXF1ZXVlIHsKcHVibGljOgogICAgbXlxdWV1ZSgpIDogcSgpIHt9CiAgICB2aXJ0dWFsIH5teXF1ZXVlKCkge30KCiAgICAvLyBwdXNoZXMgYSBjb3B5CiAgICB2b2lkIHB1c2goY29uc3QgVCYgaXRlbSkgewogICAgICAgIHEucHVzaChpdGVtKTsKICAgIH0KICAgIC8vIHB1c2hlcyB0aGUgb2JqZWN0IGl0c2VsZiAobW92ZSkKICAgIHZvaWQgcHVzaChUJiYgaXRlbSkgewogICAgICAgIHEucHVzaChzdGQ6Om1vdmUoaXRlbSkpOwogICAgfQpwcml2YXRlOgogICAgc3RkOjpxdWV1ZTxUPiBxOwp9OwoKY2xhc3Mgbm9jb3B5IHsKcHVibGljOgogICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgbm9jb3B5KCkge30KCiAgICAvLyBNb3ZlIHNlbWFudGljcwogICAgbm9jb3B5KG5vY29weSYmIG90aGVyKSB7fQogICAgbm9jb3B5JiBvcGVyYXRvcj0obm9jb3B5JiYgcmhzKSB7CiAgICAgICAgbm9jb3B5KHN0ZDo6bW92ZShyaHMpKS5zd2FwKCp0aGlzKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgLy8gRGlzYWJsZSBjb3B5IHNlbWFudGljcwogICAgbm9jb3B5KGNvbnN0IG5vY29weSYgb3RoZXIpID0gZGVsZXRlOwogICAgbm9jb3B5JiBvcGVyYXRvcj0oY29uc3Qgbm9jb3B5JiByaHMpID0gZGVsZXRlOwoKICAgIHZvaWQgc3dhcChjb25zdCBub2NvcHkmIG90aGVyKSB7fQp9OwoKaW50IG1haW4oKSB7CiAgICBteXF1ZXVlPGludD4gcTE7IC8vIGNvbXBpbGVzIGZpbmUuCiAgICBxMS5wdXNoKDEpOwoKICAgIHN0ZDo6cXVldWU8bm9jb3B5PiBxMjsgLy8gY29tcGlsZXMgZmluZS4KICAgIG5vY29weSBuYzE7CiAgICBxMi5wdXNoKHN0ZDo6bW92ZShuYzEpKTsKCiAgICBteXF1ZXVlPG5vY29weT4gcTM7IC8vIEVSUk9SIDooCiAgICBub2NvcHkgbmMyOwogICAgcTMucHVzaChzdGQ6Om1vdmUobmMyKSk7Cn0KCgo=