#include <cstdio>
template<typename T>
class Test {
private:
T value_;
public:
mutable bool has_copies;
Test(const T& value) : value_(value), has_copies(false) {}
template<typename Related> // remove template here to fix behavior
Test(const Test<Related>& t) {
printf("In copy constructor\n"); fflush(stdout);
value_ = t.value_;
has_copies = true;
t.has_copies = true;
}
};
int main() {
Test<int> t1(42);
printf("Before constructor\n");
Test<int> t2(t1);
printf("After constructor:\n");
printf(" t1 thinks it %s copies\n", t1.has_copies ? "has" : "doesn't have");
printf(" t2 thinks it %s copies\n", t2.has_copies ? "has" : "doesn't have");
}
I2luY2x1ZGUgPGNzdGRpbz4KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIFRlc3Qgewpwcml2YXRlOgogICAgVCB2YWx1ZV87CgpwdWJsaWM6CiAgICBtdXRhYmxlIGJvb2wgaGFzX2NvcGllczsKCiAgICBUZXN0KGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSksIGhhc19jb3BpZXMoZmFsc2UpIHt9CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVsYXRlZD4gLy8gcmVtb3ZlIHRlbXBsYXRlIGhlcmUgdG8gZml4IGJlaGF2aW9yCiAgICBUZXN0KGNvbnN0IFRlc3Q8UmVsYXRlZD4mIHQpIHsKICAgICAgICBwcmludGYoIkluIGNvcHkgY29uc3RydWN0b3JcbiIpOyBmZmx1c2goc3Rkb3V0KTsKICAgICAgICB2YWx1ZV8gPSB0LnZhbHVlXzsKICAgICAgICBoYXNfY29waWVzID0gdHJ1ZTsKICAgICAgICB0Lmhhc19jb3BpZXMgPSB0cnVlOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBUZXN0PGludD4gdDEoNDIpOwogICAgcHJpbnRmKCJCZWZvcmUgY29uc3RydWN0b3JcbiIpOwogICAgVGVzdDxpbnQ+IHQyKHQxKTsKICAgIHByaW50ZigiQWZ0ZXIgY29uc3RydWN0b3I6XG4iKTsKICAgIHByaW50ZigiICAgIHQxIHRoaW5rcyBpdCAlcyBjb3BpZXNcbiIsIHQxLmhhc19jb3BpZXMgPyAiaGFzIiA6ICJkb2Vzbid0IGhhdmUiKTsKICAgIHByaW50ZigiICAgIHQyIHRoaW5rcyBpdCAlcyBjb3BpZXNcbiIsIHQyLmhhc19jb3BpZXMgPyAiaGFzIiA6ICJkb2Vzbid0IGhhdmUiKTsKfQ==